错误分为可恢复的错误和不可恢复的错误,可恢复的错误指的是能预见并处理的错误,例如文件不存在,网络连接失败等;不可恢复的错误指的是一类特殊的bug,例如强制展开值为nil的可空实例,数组越界访问等;如果发生错误没有处理,程序就会停止运行。遗憾的是Swift中似乎只能处理可恢复的错误。
断言
Swift中使用assert添加断言,第一个参数表示要检查的条件,为true时什么也不做,为false时停止运行并显示错误信息;第二个参数为检查条件为false时输出的字符串信息,默认为空;最后两个参数为调用assert所在的源文件名,行号。
/// - Parameters:
/// - condition: The condition to test. `condition` is only evaluated in
/// playgrounds and `-Onone` builds.
/// - message: A string to print if `condition` is evaluated to `false`. The
/// default is an empty string.
/// - file: The file name to print with `message` if the assertion fails. The
/// default is the file where `assert(_:_:file:line:)` is called.
/// - line: The line number to print along with `message` if the assertion
/// fails. The default is the line number where `assert(_:_:file:line:)`
/// is called.
public func assert(_ condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line)
assert只有在调试模式才有效,要想在发布模式也生效可以使用precondition,两者用法相同
var number1=1
assert(number1 != 1,"number1 is 1")
precondition(number1 != 1,"number1 is 1")
抛出错误
遇到错误时,可以使用throw抛出一个符合Error协议的类型的实例,由于Error协议是一个空协议,所以不需要任何属性或方法,就能实现Error协议。如果该错误没有被处理,则会停止运行,例如下面的代码。
import Foundation
struct XYError:Error{
}
throw XYError()
捕捉错误
Swift中使用do...catch捕捉抛出的错误,如果没有指定错误类型则会捕捉所有错误
import Foundation
struct XYError:Error{
}
do{
throw XYError()
}catch{
print("error")
}
也可以捕捉多个错误
import Foundation
enum NetError:Error{
case serverError
}
struct XYError:Error{
var errorType:Int
}
do{
throw XYError(errorType:3)
throw NetError.serverError
}catch NetError.serverError{
print("net error")
}catch let e as NetError{
print("net error \(e)")
}catch let e as XYError{
print(e.errorType)
}catch{
print("error")
}
可抛出错误的函数
在函数签名后面加上throws表示该函数可能会抛出错误,调用此函数时前面必须加上try,并且需要把调用此函数写在do...catch内。
func makeError(arg:Int) throws->Int{
guard arg > 10 else {
throw XYError(errorType:3)
}
return arg
}
//编译会报错
func testFunc(){
try makeError(arg: 1)
}
//正确写法
func testFunc(){
do{
try makeError(arg: 1)
}catch{
print("error")
}
}
如果调用可抛出错误的函数的函数也标记为throws,那么该函数可以不处理错误,错误将再次抛出
func makeError(arg:Int) throws->Int{
guard arg > 10 else {
throw XYError(errorType:3)
}
return arg
}
func testFunc() throws{
try makeError(arg: 1)
}
调用可抛出错误的函数的函数也可以使用try!告诉编译器不想处理潜在错误,出现错误时停止运行
func makeError(arg:Int) throws->Int{
guard arg > 10 else {
throw XYError(errorType:3)
}
return arg
}
func testFunc() {
try! makeError(arg: 1)
}
try还有另外一种变体try?,可以在发生错误时忽略错误,但不会停止运行而是返回原本返回值的可空类型
func makeError(arg:Int) throws->Int{
guard arg > 10 else {
throw XYError(errorType:3)
}
return arg
}
func testFunc() {
print(try? makeError(arg: 1))
}
网友评论