Swift 2.0似乎已经从运行时错误处理的传统ObjC(返回NSError)和Swift 1.X(成功/失败可选)约定转变为类似于Java / C#/ C ++ / etc等语言中的异常处理的约定。
苹果公司传统上强调使用NSError而不是抛出NSException for runtime errors(相对于程序员错误),因为NSException使用默认的ObjC编译器设置,展开堆栈可能会导致内存泄漏。
NSError
NSException for runtime errors
NSException
但是现在他们设计出了与传统例外非常相似的东西。我的问题是:
除了 命名法 (错误与异常)和 语法 (do-catch,而不是try-catch,在方法调用之前尝试使用,等等)之外,Swift 2.0错误处理与传统异常处理之间是否存在任何实际区别。
我发现了3个主要差异:
不必列出功能可能引发的所有错误,只throws需要一个关键字即可。
throws
使用这些错误时,速度没有明显的下降,而Java和其他语言则需要构造一个Exception对象并展开堆栈。在Swift中,throws可以将关键字视为返回Either-object 的函数,其中一个是原始返回类型,另一个是ErrorType值。
Exception
Either
ErrorType
在Swift中,所有错误都需要处理或声明为抛出,因此无法从未声明正在抛出错误的方法中获取错误。(用Java术语来说,所有错误都是“检查过的异常”)