2016-09-21 86 views
10

当在Swift 3中调用函数throws时,必须详尽地捕捉所有可能的错误,这通常意味着在最后有一个不必要的额外的catch {}来处理不会发生的错误。我可以限制函数在Swift中引发的类型吗?

是否有可能说throws MyErrorType,以便编译器可以知道在处理该枚举中的所有情况时确实已经详尽无遗?

+4

不,你不能...... –

+1

相关: http://stackoverflow.com/questions/30740997/what-is-the-difference-between-swift-2-0-do-try-catch-and-regular-java-cc-ex。 –

回答

2

有没有简单的方法是类型安全的抛出错误。考虑到这一点,如果编译器允许你指定throws MyErrorType,那么它也必须确保在那个函数体内你不是一个可能在do/catch块之外抛出不同类型的函数。 (好吧,但它会增加不必要的复杂层次)。当推断类型时,Swift编译器可能已经很慢并且陷入循环中,推断抛出类型一直到抛出函数链可能是一场噩梦。

正在运行的想法是,对于大多数错误,无论如何你都要以小部分方式处理它们。

话虽这么说,没有必要为你增添额外catch let error as MyErrorType条款,你可以简单地在一个catch块使用一个开关,像这样:

do { 
    try something() 
} catch let e { 
    switch e { 
    case let m as MyErrorType: handleMyError(m) 
    case let o as OtherErrorType: handleOther(o) 
    case is ThirdErrorType: print("error \(e)") 
    default: handleElse(e) 
    } 
} 
相关问题