Swift的错误处理和Java的相似!!
自定义错误
struct ValueError : Error {
let reason: String
}
实现Error协议便可自定义错误。
抛出异常
fun getValue100(error: Bool) throws -> Int {
if error {
throw ValueError(reason: "100")
}
return 100
}
其抛出异常也和Java的很像相似。
传递错误
和Java一样,也可以将错误传递出去
fun getValue() throws -> Int {
return try getValue100(false)
}
这样的话,就先不会处理,交给外部调用tryError方法时处理,不过还是要“try”关键字。
错误处理 Do-Catch
Swift的错误捕捉和处理
// 如果不想处理ValueError
do {
try getValue100(true)
} catch {
...
}
// 如果想判断错误来自于ValueError
do {
try getValue100(true)
} catch is ValueError {
...
}
// 如果想要处理ValueError
do {
try getValue100(true)
} catch let error as ValueError {
...
}
将错误转成可选值
如果调用方法(可能会抛出错误)有返回值,而且你可能不太想处理抛出的错误,你可以把这个方法(加关键字)赋给一个变量,那么这个变量就是一个可选类型。
var value = try? getValue100(true) // value此时的类型是Int?,可能为nil
if let v = value {
print("value is \(v)")
}
利用这种方式,我们可以写出比较优雅的代码
func getValue100(error: Bool) throws -> Int {
if error {
throw ValueError(reason: "100")
}
return 100
}
func getValue200(error: Bool) throws -> Int {
if error {
throw ValueError(reason: "200")
}
return 200
}
func getValue() -> Int? {
if let value = try? getValue100(error: false) {
return value
}
if let value = try? getValue200(error: false) {
return value
}
return nil
}
禁止错误传递
虽然getValue100()方法可能会报错,但是如果传入为false的话,肯定不会报错,我们可以禁止错误传递
let value = try! getValue100(error: false)
到此,应该大概能猜出“!”的意义了吧,“!”一般用于强制性的操作,如可选类型。