Swift-23-异常处理和程序预处理

异常处理

你用过的软件是否经常崩溃或者做一些出乎你意料的事情?大部分情况下,这些问题是不正确的错误处理造成的。错误处理是软件开发中的幕后英雄:没人认为它重要;如果做好了,没人会注意到。同时它又非常关键:如果没做好,软件的用户肯定会注意到(而且会抱怨)。本章会探索Swift提供的捕获和处理错误的工具。

在Swift中也异常分为需查和不需查异常两类,但一般称为可恢复的错误和不可恢复的错误。一个异常的例子

var position: String.CharacterView.Index

expression failed to parse:
error: MyPlayground.playground:16:26: error: 'CharacterView' is unavailable: Please use String directly
    var position: String.CharacterView.Index    

语法格式

do{
    try  //指定可能会出现问题的代码,可以存在多个try
}
catch{ //可以存在多个catch
}

自定义异常

下面是一个综合的例子,包括自定义异常类型,以及如何抛出异常。

class Lexer {
    enum Error: Swift.Error {
        case invalidCharacter(Character)
    }
}    

手功抛出异常

需要用到关键字 throw

class Lexer {
    enum Error: Swift.Error {
        case invalidCharacter(Character)
    }

    func lex() throws -> [Token] { //Token为一自定义的枚举对象
        var tokens = [Token]()
        throw Lexer.Error.invalidCharacter(nextCharacter)
        return tokens
    }
}

稍复杂一点的例子

class Parser {
    enum Error: Swift.Error {
        case unexpectedEndOfInput
        case invalidToken(Token)
    }

    func getNumber() throws -> Int {
        guard let token = getNextToken() else {
            throw Parser.Error.unexpectedEndOfInput
        }

        switch token {
        case .number(let value):
            return value

        case .plus:
            throw Parser.Error.invalidToken(token)
        }
    }

    func parse() throws -> Int {
        while let token = getNextToken() {
            switch token {
            case .plus:
                let nextNumber = try getNumber()
                value += nextNumber
            case .number:
                throw Parser.Error.invalidToken(token)
            }
        }

        return value
    }
}

捕获异常

定义一个自定义的异常类型,需要用到关键字catch

class Parser {
    enum Error: Swift.Error {
        case unexpectedEndOfInput
        case invalidToken(Token)
    }
}    

一个综合的例子

//Lexer为自定义的类,实现暂时可忽略
func evaluate(_ input: String) {
    let lexer = Lexer(input: input)

    do {
        let tokens = try lexer.lex() //try

        let parser = Parser(tokens: tokens)
        let result = try parser.parse() //try
    } catch Lexer.Error.invalidCharacter(let character) {
        print("Input contained an invalid character: \(character)")
    } 
    
    catch Parser.Error.unexpectedEndOfInput {
        print("Unexpected end of input during parsing")
    } 
    
    catch Parser.Error.invalidToken(let token) {
        print("Invalid token during parsing: \(token)")
    } 
    
    catch { //通用异常捕获,而且这行必须要不,这是swift一个强制规定
        print("An error occurred: \(error)")
    }
}

测试代码

evaluate("10 + 3 + 5")

//输出如下
expression failed to parse:
error: exception.xcplaygroundpage:141:17: error: cannot find 'Lexer' in scope
    let lexer = Lexer(input: input)
                ^~~~~

error: exception.xcplaygroundpage:147:22: error: cannot find 'Parser' in scope
        let parser = Parser(tokens: tokens)
                     ^~~~~~

error: exception.xcplaygroundpage:150:13: error: cannot find 'Lexer' in scope
    } catch Lexer.Error.invalidCharacter(let character) {
            ^~~~~

error: exception.xcplaygroundpage:152:13: error: cannot find 'Parser' in scope
    } catch Parser.Error.unexpectedEndOfInput {
            ^~~~~~

error: exception.xcplaygroundpage:154:13: error: cannot find 'Parser' in scope
    } catch Parser.Error.invalidToken(let token) {
            ^~~~~~

不可查异常

  • try!:如果遇到错误则强制抛出异常,它可以不放在do{}中,比如:
//实例化一个Lexer
let lexInstance = Lexer()
//如果 lexInstance.lex() 代码出现了错误,则无法捕获,整个程序就会退出。
let lexToken = try!lexInstance.lex()

异常忽略

  • try?:如果遇到错误则可以忽略异常,它可以不放在do{}中,比如:
let lexInstance = Lexer()
guard let lexToken = try? lexInstance.lex() else{
    return
}

上面这行代码会在异常时返回nil,注意处理nil的情况

if lexToken == nil {

}

程序预处理

typealias 设置别名

下面的代码表示把系统提供的Double重新命名为Velocity,这样系统中可以同时使用不同的关系字来表示Double的浮点数了。

typealias Velocity = Double

//使用
var dou:Velocity = 12;

typealias 的位置不固定,可以定义在类外面,也可以定义在类里面,比如:

class Accountant {
    typealias NetWorthChanged = (Double) -> Void

    var netWorthChangedHandler: NetWorthChanged? = nil

    var netWorth: Double = 0.0 {
        didSet {
            netWorthChangedHandler?(netWorth)
        }
    }

    func gained(_ asset: Asset, completion: () -> Void) {
        netWorth += asset.value
        completion()
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558763.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程的地址空间

一、看现象 1 #include<stdio.h>2 #include<unistd.h>3 4 int g_val 100;5 int main()6 {7 printf("father process is running!pid: %d,ppid: %d\n",getpid(),getppid( ));8 sleep(1);9 10 int id fork();11 if(id 0)12 {13 int cn…

vue快速入门(三十二)局部与全局注册组件的步骤

注释很详细&#xff0c;直接上代码 上一篇 新增内容 局部注册组件全局注册组件 文件结构 源码 MyHeader.vue <!-- 用于测试全局注册组件 --> <template><div><h1>又可以愉快的学习啦</h1></div> </template><script>export d…

go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控

Linux中的tail命令 tail 命令是一个在 Unix/Linux 操作系统上用来显示文件末尾内容的命令。它可以显示文件的最后几行内容&#xff0c;默认情况下显示文件的最后 10 行。tail 命令 非常有用&#xff0c;特别是在我们查看日志文件或者监视文件变化时。 基本用法如下&#xff1a…

LLM生成模型在生物单细胞single cell的应用:scGPT

参考&#xff1a; https://github.com/bowang-lab/scGPT https://www.youtube.com/watch?vXhwYlgEeQAs 相关算法&#xff1a; 主要是把单细胞测序出来的基因表达量的拼接起来构建成的序列&#xff0c;这里不是用的基因的ATCG&#xff0c;是直接用的基因名称 训练数据&#x…

vue+springboot+websocket实时聊天通讯功能

前言 在我的前一篇文章里 vuespringboot实现聊天功能 &#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; 实现了最最基础的聊天功能&#xff0c;可以通过聊天互相给对方发送信息 &#x1f388;&#x1f388;&#x1f388;&…

Python全栈开发前端与后端的完美融合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在当今互联网时代&#xff0c;全栈开发已经成为了一种趋势。全栈开发者具备前端和后端开发的…

KMP算法(Python)

进阶的做法就是KMP算法&#xff0c;当然暴力也能ac。 KMP主要用一个nex列表&#xff0c;nex[i]存储&#xff08;模式串needle中&#xff09;从第0个到i个字符串s中的一个相等前后缀的最大长度。比如说对于aabaa来说&#xff0c;最大长度应该是&#xff08;前缀aa&#xff09;和…

HarmonyOS开发案例:【首选项】

介绍 本篇Codelab是基于HarmonyOS的首选项能力实现的一个简单示例。实现如下功能&#xff1a; 创建首选项数据文件。将用户输入的水果名称和数量&#xff0c;写入到首选项数据库。读取首选项数据库中的数据。删除首选项数据文件。 最终效果图如下&#xff1a; 相关概念 [首…

盗梦攻击:虚拟现实系统中的沉浸式劫持

虚拟现实&#xff08;VR&#xff09;硬件和软件的最新进展将改变我们与世界和彼此互动的方式&#xff0c;VR头显有可能为用户提供几乎与现实无差别的深度沉浸式体验。它们还可以作为一种跨越遥远距离的方式&#xff0c;通过使用个性化的化身或我们的数字代表&#xff0c;促进社…

笔记-----BFS宽度优先搜索

对于BFS&#xff1a;宽搜第一次搜到就是最小值&#xff0c;并且基于迭代&#xff0c;不会爆栈。 Flood Fill 模型 如果直译的话就是&#xff1a;洪水覆盖&#xff0c;意思就是像是从一个点一圈圈的往外扩散&#xff0c;如果遇见能够连通的就扩散&#xff0c;如果遇见无法联通的…

汽车4S集团数据分析

派可数据分析--汽车4S集团。 派可数据汽车4S集团数据分析概述。派可数据汽车4S集团分析主题全面涵盖行业内各板块业务分析&#xff0c;具体包括&#xff1a;保险业务分析、客户关系分析、汽车保养情况分析、售后维修主题分析、整车销售分析、整车库存分析、装具销售分析、配件…

原型和原型链--图解

https://juejin.cn/post/7255605810453217335 prototype是函数的属性&#xff08;一个对象&#xff09;&#xff0c;不是对象的属性&#xff0c;普通函数和构造函数的prototype属性是空对象&#xff5b;&#xff5d;&#xff08;其实有2个属性&#xff0c;一个是constructor&a…

账号安全基本措施2

sudo命令 sudo(superuser do)&#xff0c;允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。 其配置在/etc/sudoers权。它允许系统管理员集中的管理用户的使用权限和使用的主机。属性必须为0440。 语法检查&#xff1a; 检查语法&#xff1a; 修改文件时&…

Excel中将单元格格式改成文本后,为何要双击数字才会改变?

将大批量的数值型数字转换成文本型数字&#xff0c;当然不能一个一个的去双击做转换了。以下说说有哪个可以将数值型数字转换成文本型数字的方法。 一、转换方法 方法1.数据分列功能 选中数据后&#xff0c;点击数据选项卡&#xff0c;分列&#xff0c; 分列向导的第一步和…

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言&#xff0c;这使我们只要生成一个可执行程序即…

ACL的基本配置

已经启用&#xff52;&#xff49;&#xff50;实现了全网可达。 这时我们要拒绝R1与R4的路由通信&#xff0c;做标准ACL过滤关注源IP需要尽量靠近目标。则在R4的物理接口G0/0/1的&#xff49;&#xff4e;接口上做&#xff0c;不能在R4的环回接口上做&#xff0c;因为ACL列表…

【Taro3踩坑日记】找不到sass的类型定义文件

问题截图如下&#xff1a;找不到sass的类型定义文件 解决办法&#xff1a; 1、npm i types/sass1.43.1 2、然后配置 TypeScript 编译选项&#xff1a;确保 TypeScript 编译器能够识别 Sass 文件&#xff0c;并正确处理它们。

小程序 前端如何用wx.request获取 access_token接口调用凭据

在微信小程序中&#xff0c;获取access_token通常是通过wx.request方法来实现的。以下是一个简单的示例代码&#xff1a; 1.获取小程序的appID 与 secret&#xff08;小程序密钥&#xff09; 登录之后,请点击左侧的"开发管理">点击"开发设置" 就可以找…

在Ubuntu 22.04上安装配置VNC实现可视化

前面安装的部分可以看我这篇文章 在Ubuntu 18.04上安装配置VNC实现Spinach测试可视化_ubuntu18开vnc-CSDN博客 命令差不多一样&#xff1a; sudo apt update sudo apt install xfce4 xfce4-goodies sudo apt install tightvncserver这个时候就可以启动server了 启动server&…

.net8系列-01手把手教你创建一个新的.net应用(.net7和.net8的不同点)以及三种方案进行接口调试

前提条件 如果没有安装VS2022.17.8 版本环境&#xff0c;请参考我的.net系列其他安装步骤文章来进行安装&#xff08;发布本文的时候另一篇文章正在审核无法放链接&#xff0c;等后续补充哦&#xff0c;也可以自己搜索我的博文哦~很齐全&#xff09; Windows版本.net环境搭建…
最新文章