1.Swift 中有4
种处理错误的方式。你可以把函数抛出的错误传递给调用此函数的代码、用do-catch
语句处理错误、将错误作为可选类型处理、或者断言此错误根本不会发生。
2.wift 中的错误处理并不涉及解除调用栈,这是一个计算代价高昂的过程。就此而言,throw
语句的性能特性是可以和return
语句相媲美的。
3.一个标有throws
关键字的函数被称作throwing 函数。如果这个函数指明了返回值类型,throws
关键词需要写在箭头(->
)的前面。只有 throwing 函数可以传递错误。任何在某个非 throwing 函数内部抛出的错误只能在函数内部处理。
4.可以使用try?
通过将错误转换成一个可选值来处理错误。如果在评估try?
表达式时一个错误被抛出,那么表达式的值就是nil
。
let x = try? someThrowingFunction()
//等价于
let y: Int?
do {
y = try someThrowingFunction()
} catch {
y = nil
}
5.可以在表达式前面写try!
来禁用错误传递,这会把调用包装在一个断言不会有错误抛出的运行时断言中。如果实际上抛出了错误,你会得到一个运行时错误。
6.可以使用defer
语句在即将离开当前代码块时执行一系列语句。该语句让你能执行一些必要的清理工作,不管是以何种方式离开当前代码块的——无论是由于抛出错误而离开,还是由于诸如return
或者break
的语句。
if exists(filename) {
let file = open(filename)
defer {
close(file)
}
// close(file) 会在这里被调用,即作用域的最后。
}