当前位置: 首页 > 面试题库 >

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

钱睿范
2023-03-14
问题内容

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

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


问题答案:

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

  • [速动用户]“商业应用市场”的火焰

在swift-users论坛中。提取:

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

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

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

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

有关更多信息,请参见

  • 错误处理理由和建议


 类似资料:
  • Twilio新手使用测试帐户。我按照这里列出的安装Twilio PHP的说明进行了安装:https://www.Twilio.com/docs/quickstart/php/sms 因为我得到了一个证书错误,所以我的主机提供程序建议我更改CURLOPT_SSL_VERIFYPEER=>false(从true改为true)。但现在我得到了这个错误。如何修复?:致命错误:未捕获异常“services_

  • 我正在尝试创建一个过滤器来处理异常(请参见在JSF中处理未捕获的异常) 我在日志中看到错误: 我做错了什么?

  • 我在进行贝宝支付时出现了经验错误。 致命错误:未捕获异常“PayPal\exception\PayPalConnectionException”,消息为“访问https://api.sandbox.paypal.com/v1/payments/payment时获得Http响应代码400”。在C:\xampp\htdocs\paypal\workload\third_party\vendor\pay

  • 我目前在我的路由中使用dotry/doCatch块,因此我无法使用全局onException块。 然而,如果驼峰路由中断(由于错误代码或意外/未测试的场景),我希望执行一些业务逻辑。希望这永远不会发生,但我仍然想处理更糟糕的情况。 我不能在全局OneException块中有java.lang.Exception,而且,我不想在每个路由上都添加一个额外的捕获。 在抛出未捕获的异常和中断路由之前,是否

  • 本节介绍如何使用三个异常处理程序组件(try、catch 和 finally)来编写异常处理程序。 然后,介绍了 Java SE 7中引入的 try-with-resources 语句。 try-with-resources 语句特别适合于使用Closeable的资源(例如流)的情况。 本节的最后一部分将通过一个示例来分析在各种情况下发生的情况。 以下示例定义并实现了一个名为ListOfNumbe

  • 我的用它的作用域启动coroutine 我的只处理一些逻辑,在本例中是某种验证器 然后我的只处理网络层/本地层 以下是我得到的错误日志: 错误直接指向显式的语句。