处理方式
// 方式一:try方式 程序员手动捕捉异常
do {
try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
} catch {
// error异常的对象
print(error)
}
// 方式二:try?方式(常用方式) 系统帮助我们处理异常,如果该方法出现了异常,则该方法返回nil.如果没有异常,则返回对应的对象
guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else {
return
}
// 方式三:try!方法(不建议,非常危险) 直接告诉系统,该方法没有异常.注意:如果该方法出现了异常,那么程序会报错(崩溃)
let anyObject = try!NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)
定义异常类型
在 Swift 中,错误用符合Error协议的类型的值来表示。这个空协议表明该类型可以用于错误处理。
Swift 的枚举类型尤为适合构建一组相关的错误状态,枚举的关联值还可以提供错误状态的额外信息。
enum ExceptionError: Error {
case ExceptionErrorA //异常错误A
case ExceptionErrorB //异常错误B
case ExceptionErrorC //异常错误C
}
抛出一个错误可以让你表明有意外情况发生,导致正常的执行流程无法继续执行。抛出错误使用throw关键字。
定义异常函数
func canThrowErrors(type: Int) throws -> String? {
//函数体写成switch/case更好一些
if type == 1 {
throw ExceptionError.exceptionErrorA
}
if type == 2 {
throw ExceptionError.exceptionErrorB
}
if type == 3 {
throw ExceptionError.exceptionErrorC
}
return "success"
}
异常处理 (方式一)
do {
let data = try canThrowErrors(type: 1)//执行这个函数 这个函数可能抛出异常
if let d = data {
print(d)
} else {
print("nil")
}
} catch ExceptionError.exceptionErrorA {
print("exceptionErrorA")
} catch ExceptionError.exceptionErrorB {
print("exceptionErrorB")
} catch ExceptionError.exceptionErrorC {
print("exceptionErrorC")
} catch {
print("exceptionErrorMore")
}
异常处理 (方式二)
print("\(String(describing: try? canThrowErrors(type: 1)))")
异常处理 (方式三)
这个把上面的try?改为try!就好
异常处理 defer (指定清理操作)
可以使用defer语句在即将离开当前代码块时执行一系列语句。该语句让你能执行一些必要的清理工作,不管是以何种方式离开当前代码块的——无论是由于抛出错误而离开,或是由于诸如return、break的语句。例如,你可以用defer语句来确保文件描述符得以关闭,以及手动分配的内存得以释放。
defer语句将代码的执行延迟到当前的作用域退出之前。该语句由defer关键字和要被延迟执行的语句组成。延迟执行的语句不能包含任何控制转移语句,例如break、return语句,或是抛出一个错误。
- 延迟执行的操作会按照它们声明的顺序从后往前执行——也就是说,第一条defer语句中的代码最后才执行,第二条defer语句中的代码倒数第二个执行,以此类推。最后一条语句会第一个执行
func canThrowErrors(type: Int) throws -> String? {
defer {//抛出异常就执行defer 为抛出异常就最后执行defer
print("canThrowErrors defer Top")
}
defer {//抛出异常就执行defer 为抛出异常就最后执行defer
print("canThrowErrors defer Middle")
}
defer {//抛出异常就执行defer 为抛出异常就最后执行defer
print("canThrowErrors defer Bottom")
}
//函数体写成switch/case更好一些
if type == 1 {
throw ExceptionError.exceptionErrorA
}
if type == 2 {
throw ExceptionError.exceptionErrorB
}
if type == 3 {
throw ExceptionError.exceptionErrorC
}
return "success"
}
再执行一遍方式一,打印结果
canThrowErrors defer Bottom
canThrowErrors defer Middle
canThrowErrors defer Top
exceptionErrorA