我想从某些“深度”函数中引发异常,因此它会冒泡到另一个函数,我想在该函数中捕获它。
f1调用f2调用f3调用... fN可能会引发错误

我想从f1捕获错误。

我已经读过,在Swift中,我必须使用throws声明所有方法,还必须使用try调用它们。

但这很烦人:

enum MyErrorType : ErrorType {
    case SomeError
}

func f1() {
    do {
        try f2()
    } catch {
        print("recovered")
    }
}

func f2() throws {
    try f3()
}

func f3() throws {
    try f4()
}

...

func fN() throws {
    if (someCondition) {
      throw MyErrorType.SomeError
    }
}

是不是Java中的RuntimeException没有类似的概念,在其中throws不会在调用链中一直泄漏?

最佳答案

Swift中的错误处理机制不涉及引发未经检查的(运行时)异常。相反,需要显式的错误处理。当然,Swift并不是唯一用于此设计的最新设计语言-例如RustGo也需要以自己的方式来明确描述代码中的错误路径。在Objective-C中,存在未经检查的异常功能,但该功能仅用于传达程序员错误,只有少数关键的Cocoa类(例如NSFileHandle)会引起人们的注意,这是一个明显的异常(exception)。

从技术上讲,您确实可以通过使用NSException(name: "SomeName", reason: "SomeReason", userInfo: nil).raise()在Swift中引发Objective-C异常,正如in this excellent answerthis question所述,可以说是您问题的重复。但是,您实际上不应该引发NSExceptions(尤其是因为您没有Swift中可用的Objective-C异常捕获语言功能)。

他们为什么要采用这种设计?苹果的"Error Handling in Swift 2.0"文件清楚地说明了基本原理。从那里报价:

10-07 19:43
查看更多