Tho*_*rer 5 error-handling swift
我试图简单地将抛出函数作为参数传递给另一个函数,然后该函数将处理 swift 的错误处理:
enum Err: ErrorType {
case pfui
}
func bad(i: Int) throws -> String {
if i < 10 {
return String(i)
} else {
throw Err.pfui
}
}
func handle(@autoclosure f: () throws -> String) -> String {
do {
return try f()
}
catch {
return "oh snap"
}
}
// error: call can throw but is not marked with 'try'
handle(bad(3))
Run Code Online (Sandbox Code Playgroud)
它一定是我遗漏的一些简单的东西,但不知何故 autoclosure 属性并没有阻止编译器认为我实际上是在调用它。
您还可以使用rethrows
关键字 onhandle
来指示如果闭包是一个抛出函数,handle
将“重新抛出”它。如果你这样做了,那么你就不需要在handle
. 所以这取决于你想在哪里捕捉错误:
func handle(@autoclosure f: () throws -> String) rethrows -> String {
return try f()
}
do {
try handle(bad(11))
} catch {
print("\(error)") // prints "pfui"
}
Run Code Online (Sandbox Code Playgroud)
我想这取决于你想在哪里进行错误处理。您希望在内部处理所有错误handle
,还是希望能够在外部处理它们handle
?
嗯……最终我自己发现了。
handle(try bad(3))
Run Code Online (Sandbox Code Playgroud)
就可以了。事后看来,编译器实际上是在告诉我如何进行更改。然而,我仍然不明白为什么我必须try
在不是调用站点的地方标记部分应用函数的名称。
归档时间: |
|
查看次数: |
1792 次 |
最近记录: |