【问题标题】:Passing throwing functions as arguments将抛出函数作为参数传递
【发布时间】:2016-04-21 06:48:10
【问题描述】:

我试图简单地将一个抛出函数作为参数传递给另一个函数,然后它将处理 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))

它一定是我缺少的一些简单的东西,但不知何故,自动关闭属性并没有让编译器认为我实际上是在调用它。

【问题讨论】:

    标签: swift error-handling


    【解决方案1】:

    您还可以在handle 上使用rethrows 关键字来指示如果闭包是一个抛出函数,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 外部处理它们?

    【讨论】:

    • 这个想法是处理handle 内部的错误,所以rethrows 不是我想要的。代码被细化以说明问题;在我的应用程序中,我使用句柄函数将错误处理模型从我不喜欢的 swift 的 do/try/catch 更改为基于 Result 的模型。
    • 这澄清了事情。如果其他人对 rethrows 关键字感兴趣,我会留下答案。祝你好运:)
    【解决方案2】:

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

    handle(try bad(3))
    

    成功了。事后看来,编译器实际上是在告诉我如何进行更改。但是,我仍然无法弄清楚为什么我必须在不是调用站点的地方用try 标记部分应用函数的名称。

    【讨论】:

      猜你喜欢
      • 2021-04-13
      • 2023-04-02
      • 1970-01-01
      • 2013-01-27
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多