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 个主要差异:
不需要列出一个函数可以抛出的所有错误,只需要一个throws
关键字。
使用这些错误时没有明显的减速,而Java和其他语言需要构造一个Exception
对象并展开堆栈。在 Swift 中,一个 throws
关键字可以看作是 returning 一个 Either
对象的函数,一个是原始的 return 类型,另一个是ErrorType
值。
在Swift中,所有错误都需要处理或声明为抛出,不可能从未声明抛出错误的方法中获取错误。 (在 Java 术语中,所有错误都是 "checked 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 个主要差异:
不需要列出一个函数可以抛出的所有错误,只需要一个
throws
关键字。使用这些错误时没有明显的减速,而Java和其他语言需要构造一个
Exception
对象并展开堆栈。在 Swift 中,一个throws
关键字可以看作是 returning 一个Either
对象的函数,一个是原始的 return 类型,另一个是ErrorType
值。在Swift中,所有错误都需要处理或声明为抛出,不可能从未声明抛出错误的方法中获取错误。 (在 Java 术语中,所有错误都是 "checked exceptions")