为什么Swift看起来并没有深入"在我的错误处理?

时间:2015-11-01 17:36:21

标签: swift

看到此错误:

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")
    }
}

然而我的catch涵盖了所有可能性。为什么没有Swift"深深地"分析所有可能性并告诉我什么都没有错?

例如,搜索"捕获VendingMachineError.InvalidSelection"在这里:https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html#//apple_ref/doc/uid/TP40014097-CH42-ID508

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

2 个答案:

答案 0 :(得分:4)

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

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

主要陈述:

  

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

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

对于您的情况,asdf需要定义throws,否则需要全部捕获。

答案 1 :(得分:1)

虽然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")
        }
    }()
}