【问题标题】:Why doesn't Swift look "deeply" at my error handling?为什么 Swift 对我的错误处理没有“深刻”的印象?
【发布时间】:2016-02-01 14:19:12
【问题描述】:

看到这个错误:

enum MyError: ErrorType {
    case Foo
    case Bar
}

func couldThrow(string: String) throws {
    if string == "foo" {
        throw MyError.Foo
    } else if string == "bar" {
        throw MyError.Bar
    }
}

func asdf() {
    do {
        //Error: Errors thrown from here are not handled
        //because the enclosing catch is not exhaustive.
        try couldThrow("foo")
    } catch MyError.Foo {
        print("foo")
    } catch MyError.Bar {
        print("bar")
    }
}

但我的catches 涵盖了所有可能性。为什么 Swift 不“深入”分析所有可能性并告诉我没有错?

例如,在此处搜索“catch VendingMachineError.InvalidSelection”:https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html#//apple_ref/doc/uid/TP40014097-CH42-ID508

您会在那里看到 Apple 正在按照我的方式做事。他们的代码错了吗?

【问题讨论】:

    标签: swift


    【解决方案1】:

    编译器很难确切知道一段代码可能导致哪些异常,因为任何未在更深层次处理的异常都会向上传播。虽然您的情况相对简单,但它通常是一个非常困难的问题。

    请注意,代码没有说明它可以抛出哪些异常,只是它可以抛出一些东西......

    关键声明:

    例如,以下代码处理了 VendingMachineError 枚举的所有三种情况,但所有其他错误都必须由其周围范围处理

    因此,在他们的示例中,尽管他们没有显示,但该段代码的容器也必须能够抛出。这是因为它不能处理所有可能的异常。

    对于您的情况,asdf 需要定义为 throws 或者它需要一个包罗万象。

    【讨论】:

      【解决方案2】:

      虽然 Wain 的回答是正确的,但还有另一种方法可以消除错误:使用 try! 将任何未处理的错误视为致命的运行时错误。

      func asdf() {
          try! {
              do {
                  //Error: Errors thrown from here are not handled
                  //because the enclosing catch is not exhaustive.
                  try couldThrow("foo")
              } catch MyError.Foo {
                  print("foo")
              } catch MyError.Bar {
                  print("bar")
              }
          }()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-03
        • 2019-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-26
        • 1970-01-01
        相关资源
        最近更新 更多