Tags: Swift 学习笔记
发布时间:2015-08-26
修改时间:2015-08-26
作者:Erwin
博客地址:技术杂货铺
欢迎转载,转载请注明出处。
Swift学习笔记系列——(17)错误处理
开场
错误处理响应程序错误的情况和从中恢复的过程。
不能绝对保证操作执行完毕时,需要在出现问题时对具体的原因做相应的处理。
表现和抛出错误
Swift中要表现一个错误,需要用到一个遵循ErrorType协议的类型值。
ErrorType是一个空协议。
Swift的枚举用来表现一系列的错误条件再适合不过了,尤其还有联合数值可以添加额外的信息。
抛出一个异常就是表示程序有意外的事情发生,不能再按照正常的顺序执行了。
使用throw关键字来抛出一个异常。
处理错误
当一个错误被抛出,外围需要有一系列代码负责处理它。
Swift有四种途径处理错误:传播错误;使用do-catch语句;将错误当作可选类型值;使用断言预测错误不会发生。
当一个函数抛出错误,因为这已经改变了程序的流程,需要将其标记出来。Swift使用try关键字或是try?或者try!在调用可能抛出错误的函数、方法或者构造方法前做标记。
Swift的错误处理类似其他语言的异常处理,它们使用try,catch和throw关键字。和其它语言————包括OC的区别之处是Swift没有处理起来开销较大的调用栈。Swift中的throws语句和其它语言中的return语句相像。
传播错误
在参数列表后返回值前用throws关键字表明一个函数、方法或者构造方法会抛出错误。利用这点可以将可能出现的错误抛给调用者处理。
调用这样的throwing 函数可以处理错误,或者选择继续抛出该错误,调用时要使用try关键字。
使用do-catch语句处理错误
语法示意
do { try expression statements } catch pattern 1 { statements } catch pattern 2 where condition { statements }
catch后面跟的模式表示该语句可以处理什么样的错误。如果catch后面没有用默认,那么表示它可以处理所有的错误,而且有一个本地常量error绑定到了这个错误。
catch不必处理do语句抛出的所有可能的错误。如果没有一个cactch处理了抛出的错误,错误将会被传播到外围的环境中。无论如何,错误必须要被处理。
疑问:如果就是有没有处理的错误,将会怎么样?
没有错误抛出,也就没有catch语句被执行,do语句中的后面代码会继续执行。
将错误转换为可选值
使用try?处理一个错误为一个可选值。如果执行try?表达式抛出了一个错误,那么这个表达式的值是nil。
这个写法实际是do-catch语句的简单情况的简化写法。
阻止错误传播
在明确知道不能发生错误的情况下使用这种写法。
调用时使用try!阻止错误传播并且封装调用在一个运行时断言(错误不会抛出)中。
一旦发生了错误,将会触发一个运行时错误。
指定清理行为
defer中的语句在离开当前代码块前被执行,无论是否发生了错误。
适合在defer中定义清理资源的语句
defer中不能有任何控制转移语句,比如break或者return,也不能抛出错误。
defer中定义的语句是倒序执行的。
没有错误要处理的情况也能使用defer。