将抛出函数作为参数传递

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 属性并没有阻止编译器认为我实际上是在调用它。

Aar*_*sen 5

您还可以使用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


Tho*_*rer 2

嗯……最终我自己发现了。

handle(try bad(3))
Run Code Online (Sandbox Code Playgroud)

就可以了。事后看来,编译器实际上是在告诉我如何进行更改。然而,我仍然不明白为什么我必须try在不是调用站点的地方标记部分应用函数的名称。