当在Swift 3中调用一个函数时throws,你必须在捕获所有可能的错误时详尽无遗,这通常意味着你catch {}在最后有一个不必要的额外处理来处理不会发生的错误.
是否有可能这样说throws MyErrorType,当您处理该枚举中的所有案例时,编译器可以知道您确实已经详尽无遗?
没有简单的方法可以确保类型安全并抛出错误。考虑到这一点,如果编译器允许您指定throws MyErrorType,那么它还必须确保在该函数主体中您未执行try的函数可能会在do / catch块之外抛出其他类型。(虽然有,但是会增加不必要的复杂性)。Swift编译器可能已经很慢,并且在推断类型时陷入循环,在所有抛出函数链中一直推断Throwd类型可能是一场噩梦。
运行中的想法是,对于大多数错误,无论如何都将以一小部分方式处理它们。
话虽如此,您无需添加额外的catch let error as MyErrorType子句,您只需在catch块中使用开关即可,如下所示:
do {
try something()
} catch let e {
switch e {
case let m as MyErrorType: handleMyError(m)
case let o as OtherErrorType: handleOther(o)
case is ThirdErrorType: print("error \(e)")
default: handleElse(e)
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我对这个问题的建议是不要抛出错误,而是Result在函数中返回一个类型。事情会是这样的。
enum MyCustomError: Error {
case genericError
}
func operationThatFails() -> Result<Response, MyCustomError> {
guard requiredConsition() else {
return .failure(.genericError)
}
return Response()
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样处理错误:
let result = operationThatFails()
switch result {
case .success(let value):
// handle success
case .failure(let error):
// handle error
}
Run Code Online (Sandbox Code Playgroud)
这样你的错误总是类型安全的
| 归档时间: |
|
| 查看次数: |
682 次 |
| 最近记录: |