一尘不染

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

swift

Swift 2.0似乎已经从运行时错误处理的传统ObjC(返回NSError)和Swift 1.X(成功/失败可选)约定转变为类似于Java / C#/ C
++ / etc等语言中的异常处理的约定。

苹果公司传统上强调使用NSError而不是抛出NSException for runtime errors(相对于程序员错误),因为NSException使用默认的ObjC编译器设置,展开堆栈可能会导致内存泄漏。

但是现在他们设计出了与传统例外非常相似的东西。我的问题是:

除了 命名法 (错误与异常)和 语法 (do-catch,而不是try-catch,在方法调用之前尝试使用,等等)之外,Swift
2.0错误处理与传统异常处理之间是否存在任何实际区别。


阅读 203

收藏
2020-07-07

共1个答案

一尘不染

我发现了3个主要差异:

  1. 不必列出功能可能引发的所有错误,只throws需要一个关键字即可。

  2. 使用这些错误时,速度没有明显的下降,而Java和其他语言则需要构造一个Exception对象并展开堆栈。在Swift中,throws可以将关键字视为返回Either-object 的函数,其中一个是原始返回类型,另一个是ErrorType值。

  3. 在Swift中,所有错误都需要处理或声明为抛出,因此无法从未声明正在抛出错误的方法中获取错误。(用Java术语来说,所有错误都是“检查过的异常”)

2020-07-07