一尘不染

Swift中未捕获的错误/异常处理

swift

我知道可可中有一个UncaughtExceptionHandler,但是我正在为Swift寻找相同的东西。即,每当应用程序中有任何错误/异常由于任何错误而未在本地捕获时,它应该一直冒泡到顶级应用程序对象,在那里我应该能够妥善处理它并适当地响应用户。

Android有它。Flex有它。Java有它。想知道为什么Swift缺少此关键功能。


阅读 431

收藏
2020-07-07

共1个答案

一尘不染

Swift没有机制来捕获所有任意的运行时异常。原因在

在swift-users论坛中。提取:

Swift做出了明智的选择,不包括通过任意堆栈帧抛出的异常,这并不是因为它在技术上是不可能的,而是因为其设计者认为代价太高。

问题是这样的:如果一段代码由于错误而要提早退出,则必须编写该代码来处理该提早退出。否则,它将无法正常工作-
无法释放内存,无法关闭文件句柄/套接字/数据库连接/其他内容,无法释放锁等。在Java这样的语言中,编写真正的异常安全代码需要大量的try /
finally。块。这就是为什么没人这样做。他们对可能发生的异常以及泄漏的危险资源做出判断,并且仅针对特定的预期条件保护其代码。然后发生了无法预料的事情,并且程序中断了。

在像Swift这样的引用计数语言中,情况甚至更糟,因为在出​​现异常的情况下正确平衡引用计数基本上要求每个函数都包含一个隐式的finally块来平衡所有保留计数。这意味着编译器必须在某些调用或另一个引发异常的偶然机会上生成大量额外的代码。该代码的绝大部分从未使用过,但必须存在,使过程变得blo肿。

由于这些问题,Swift选择不支持传统异常。相反,它仅允许您在代码的特殊标记区域中引发错误。但是作为必然结果,这意味着,如果在无法抛出的代码中确实出了点问题,那么为防止灾难所做的一切实际上就是崩溃。当前,唯一会崩溃的是整个过程。

有关更多信息,请参见

2020-07-07