Swift 2.0 do-try-catch 和常规 Java/C#/C++ 异常有什么区别

What is the difference between Swift 2.0 do-try-catch and regular Java/C#/C++ exceptions

似乎 Swift 2.0 已经从传统的 ObjC(NSError 返回)和 Swift 1.X(Success/Failure 可选)运行时错误处理的约定变成了某种东西这看起来与 Java/C#/C++/等语言中的异常处理非常相似

Apple 传统上有 emphasized use of NSError instead of throwing NSException for runtime errors(相对于程序员错误),因为 NSException 堆栈展开可能会导致默认 ObjC 编译器设置的内存泄漏。

然而,现在他们设计了一些看起来与传统异常非常相似的东西。我的问题是:

除了 nomenclature(错误与异常)和 syntax[=26 之外,Swift 2.0 错误处理与传统异常处理之间是否存在任何真正的区别=](do-catch,而不是try-catch,try在方法调用之前使用等)。

我发现了 3 个主要差异:

  1. 不需要列出一个函数可以抛出的所有错误,只需要一个throws关键字。

  2. 使用这些错误时没有明显的减速,而Java和其他语言需要构造一个Exception对象并展开堆栈。在 Swift 中,一个 throws 关键字可以看作是 returning 一个 Either 对象的函数,一个是原始的 return 类型,另一个是ErrorType 值。

  3. 在Swift中,所有错误都需要处理或声明为抛出,不可能从未声明抛出错误的方法中获取错误。 (在 Java 术语中,所有错误都是 "checked exceptions")