9

似乎 Swift 2.0 已经从传统的 ObjC(返回 NSError)和 Swift 1.X(成功/失败选项)运行时错误处理的约定变成了与 Java/C#/C++/等语言中的异常处理非常相似的东西.

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

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

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

4

1 回答 1

11

我发现有 3 个主要差异:

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

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

  3. 在 Swift 中,所有错误都需要被处理或声明为抛出,不可能从没有声明它正在抛出错误的方法中获取错误。(在 Java 术语中,所有错误都是“检查异常”)

于 2015-06-09T21:50:40.743 回答