【问题标题】:Swift catch enum case with bindingSwift 使用绑定捕获枚举案例
【发布时间】:2021-09-22 18:16:18
【问题描述】:

如果我有自定义错误

enum MyError: Error {
  case error1
  case error2
}

我可以捕获该类型的所有错误并绑定一个变量:

do {
} catch let e as MyError {
} catch {
  // everything else
}

或者我可以在不绑定变量的情况下捕获特定错误

do {
} catch MyError.error1 {
} catch {
  // everything else, including MyError.error2
}

但我如何捕获特定错误绑定变量?

【问题讨论】:

  • 不清楚你想要达到什么。

标签: swift exception enums pattern-matching


【解决方案1】:

如果我理解正确,您希望 catch 中的变量成为特定类型错误的特定错误情况。

如果是这样,您可以这样做:

do {
    try something()
} catch let err1 as MyError where err1 == .error1 {
    print(err1)
} catch {
    print(error)
}

【讨论】:

  • 这与实际用例中的} catch MyError.error1 { 有何不同?
  • @JoakimDanielson,我想可能存在多个错误匹配where err.rawValue > 3 的用例,这会有些用处。当我回答时,我并不关心这是否是真实案例:)
【解决方案2】:

我认为你需要的是:

    do {
        throw(MyError.error2)
    } catch let error as MyError {
        switch error {
        case .error1:
            print("error 1 happened")
            return
        case .error2:
            print("error 2 happened")
            return
        }
    } catch let error {
        print(error)
        return
    }

【讨论】:

  • 对不起,我稍微编辑了我的问题。最后我想要一个包罗万象的东西,所以你的方法会迫使我在.error2 案例中复制该代码。或者有没有办法从 .error2 到包罗万象?
  • 我认为它不会强迫您复制代码。由于 MyError 类型首先在第一个 catch 块中处理,所以 catch-all 部分不会运行。
猜你喜欢
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2015-11-16
  • 1970-01-01
相关资源
最近更新 更多