在Swift 3.1中没有空或通配符的穷举捕获块

时间:2017-07-14 13:40:16

标签: swift swift3 error-handling try-catch

Swift中的Catch子句必须是详尽无遗的。是否意味着每当我想避免错误传播时,我总是需要使用通配符或空catch子句?例如:

enum Oops: Error {
    case oh, ouch, meh
}

func troublemaker() {
    do { throw Oops.meh }
    catch Oops.oh {}
    catch Oops.ouch {}
    catch Oops.meh {}
    // Error: Error is not handled because the enclosing catch is not exhaustive
}

当然,如果我将throws添加到函数中,它就会被修复。同样适用于添加catch {}catch _ {}

但有没有办法以其他方式制作详尽的捕获块?比如,也许定义允许抛出的错误类型,所以我的枚举错误会让它变得详尽无遗?

1 个答案:

答案 0 :(得分:1)

如果您只是不喜欢多个catch块,请立即捕获所有错误,然后切换错误类型

func troublemaker() {
    do { throw Oops.meh }
    catch let error{
        switch error {
        case Oops.meh:
            print("It works!")
            break
        default:
            print("Oops something else is wrong")
            break
        }
    }
}