你可以使用错误处理来响应你的程序在执行中可能会碰到的符合错误条件的错误。
相比于可以用是否存在值来表示函数执行的成败的可选值,错误处理让你可以确定错误的内在原因,必要的话,也可以把错误传播给你程序的其他部分。
当一个函数发生了错误,它会抛出一个错误。方法的调用者可以捕获错误并且做出合适的回应:
func canThrowAnError() throws {
// this function may or may not throw an error
}
在定义函数的时候包含throws关键字可以表明这个函数可能会抛出错误。当你调用一个可能会抛出错误的函数,在表达式只预先考虑使用 try 关键字。
Swift会自动把错误传播出当前的范围,直到被catch语句捕获且处理。
do {
try canThrowAnError()
// no error was thrown
} catch {
// an error was thrown
}
一个do语句创建了一个新的局部环境,这个环境允许错误传播到一个或者更多的catch语句中。
下面是一个例子,表明了应该怎么使用错误处理来响应不同的错误条件:
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich()
} catch SandwichError.outOfCleanDishes {
washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
buyGroceries(ingredients)
}
这个例子中,函数makeASandwich()在没有可用的干净的碗碟或者缺少某一些原料的情况下会抛出错误。因为函数makeASandwich()可以抛出异常,这个函数在调用时候包在了try表达式中。把函数调用包在do语句中,抛出的错误可以被传播到下面提供的catch语句中。
如果没有错误抛出,那么函数eatASandwich()会被调用,如果有错误抛出,且错误类型和SandwichError.outOfCleanDishes相匹配,那么函数washDishes()会被调用,相同的,如果抛出的错误和SandwichError.missingIngredients相匹配,那么函数buyGroceries会配合catch语句捕获到的ingredients被调用。
关于抛出错误,捕获错误,传播错误,在后面关于错误处理的章节中会有更加详细的解释。