Swift vs Obj-C例外。什么是堆栈展开?斯威夫特为什么不这样做?

时间:2016-04-05 10:14:59

标签: objective-c swift exception

Swift Docs中有一条说明如下:

  

Swift中的错误处理类似于其他语言中的异常处理,使用了try,catch和throw关键字。与许多语言中的异常处理不同 - 包括Swift中的Objective-C-error处理不涉及展开调用堆栈,这可能是计算上昂贵的过程。因此,throw语句的性能特征与return语句的性能特征相当。

在Swift和Obj-c中展开调用堆栈意味着什么? Related question here但它是C ++特有的。我知道调用堆栈是什么,但想要更详细的解释。

如果Swift没有展开调用堆栈,它会做什么呢?

为什么计算成本会很高?

总结:我希望更好地了解异常如何工作以及Swift中的执行流程。

1 个答案:

答案 0 :(得分:4)

展开堆栈基本上意味着当抛出异常时,方法立即被中断,方法的调用者立即被中断,依此类推,直到找到异常处理程序(try-catch-finally)或者直到我们到达堆栈顶部,当异常通常以中断当前线程结束时。

这在具有垃圾收集器的语言中非常有效,但通常它会导致手动内存管理语言中的内存泄漏。此外,由于方法在意外的位置中断,异常通常会导致未定义/不可恢复的程序状态。

这就是为什么应该谨慎使用所有语言中的异常,只处理异常情况,而不是处理正常的程序流。

Obj-C异常不是很好,上面提到的所有问题(见NSException@try-@catch-@finally),这就是没有人使用它们的原因。相反,Obj-C带有错误参数(您传递对NSError变量的引用,如果方法失败,则将错误分配给该变量)。见Error Handling in Objective-C

Swift刚出现NSError的另一种语法。它不是一个真正的异常处理(错误不会中断程序执行)。见Error Handling in Swift

从技术上讲,每个可以在Swift中抛出错误的函数/方法只有一个额外的隐藏参数,用于将错误传递回调用者上下文。

如果您想了解更多信息,只需比较Swift 1.x和2.x中的代码(1.x还没有特殊的语法用于错误处理)。

相关问题