将抛出函数作为参数传递

时间:2016-01-15 16:01:41

标签: swift error-handling

我试图简单地将一个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属性不会让编译器认为我实际上是在调用它。

2 个答案:

答案 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标记部分应用的函数的名称。