我试图简单地将一个throw函数作为参数传递给另一个函数,然后它将处理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))
它必须是我缺少的简单东西,但不知何故autoclosure属性不会让编译器认为我实际上是在调用它。
答案 0 :(得分:4)
你也可以使用rethrows
上的handle
关键字来表明如果闭包是一个抛出函数,handle
将“重新抛出”它。如果您这样做,那么您不需要捕获handle
内的错误。所以它取决于你想要捕获错误的位置:
func handle(@autoclosure f: () throws -> String) rethrows -> String {
return try f()
}
do {
try handle(bad(11))
} catch {
print("\(error)") // prints "pfui"
}
我想这只取决于你想要在哪里进行错误处理。您是希望在handle
内处理所有错误,还是希望能够在handle
之外处理错误?
答案 1 :(得分:2)
嗯......最终自己找到了。
handle(try bad(3))
诀窍。事后看来,编译器实际上是在告诉我如何做出改变。我仍然无法弄清楚为什么我必须在不是呼叫站点的地方用try
标记部分应用的函数的名称。