我想从某些“深度”函数中引发异常,因此它会冒泡到另一个函数,我想在该函数中捕获它。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并不是唯一用于此设计的最新设计语言-例如Rust和Go也需要以自己的方式来明确描述代码中的错误路径。在Objective-C中,存在未经检查的异常功能,但该功能仅用于传达程序员错误,只有少数关键的Cocoa类(例如NSFileHandle
)会引起人们的注意,这是一个明显的异常(exception)。
从技术上讲,您确实可以通过使用NSException(name: "SomeName", reason: "SomeReason", userInfo: nil).raise()
在Swift中引发Objective-C异常,正如in this excellent answer至this question所述,可以说是您问题的重复。但是,您实际上不应该引发NSExceptions(尤其是因为您没有Swift中可用的Objective-C异常捕获语言功能)。
他们为什么要采用这种设计?苹果的"Error Handling in Swift 2.0"文件清楚地说明了基本原理。从那里报价: