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

快速传播的强制展开异常未传播

朱渝
2023-03-14
问题内容

我很快就遇到了这种愚蠢的行为,在这种行为中,强制展开可选对象不会传播。

从文档中:

尝试使用!访问不存在的可选值会触发运行时错误。在使用!之前,请始终确保可选内容包含非nil值。强制释放其价值。

复制:

func foo(bar:String?) throws{
    print(bar!);
}

try foo(nil);

这对我来说似乎不合逻辑或前后不一,我找不到有关此主题的任何文档。

这是设计使然吗?


问题答案:

从文档中:

错误处理

错误处理是响应程序错误状态并从错误状态中恢复的过程。Swift在运行时为抛出,捕获,传播和操作可恢复错误提供了一流的支持。

表示和抛出错误

在Swift中,错误由符合ErrorType协议的类型的值表示。此空协议表示可以将类型用于错误处理。

(注意:ErrorTypeError在Swift 3中重命名为)

因此,随着try/catch您处理n的 Swift错误
(符合ErrorType协议的类型的值)throw。这与运行时错误和运行时异常完全无关(也与NSExceptionFoundation库无关)。

请注意,有关错误处理的Swift文档甚至没有使用“ exception”一词,唯一的例外是(强调我的):

注意

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

可选对象的展开nil不会throw带来Swift错误(可能会传播),因此无法使用进行处理 try

您必须使用众所周知的技术,例如可选绑定,可选链接,对照nil等。



 类似资料:
  • 当异常被抛出到组播中时,Camel不会传播异常。 在以下设置下,从其beanref引发异常: 为什么我不能向父路由提出多播异常? 骆驼2.17-快照

  • 问题内容: 是否有关于Java中异常传播的准则? 何时在方法签名中添加例外?例如:如果仅当缺少必要的程序资源时才引发异常,并且只能在顶层进行处理,那么是否可以将所有使用erring方法的方法传播给使用此异常的所有方法? 有没有好的做法?有不良做法吗? 很抱歉,如果我含糊不清,但是我只是在寻求有关异常的编程风格的(一般)建议。 问题答案: 过去对我有帮助的准则包括: 当方法无法处理异常时引发异常 ,

  • 问题内容: 什么是异常传播?我尝试使用Google,但找不到满意的结果。最好用Java来解释这一点。 问题答案: 令人惊讶的是,在Java教程页面中有关exception的解释。 异常从一个方法传播到另一个方法,直到调用被捕获为止。因此,如果调用,调用,调用,并且如果抛出异常,则除非这些方法之一捕获到该异常,否则该异常将从d传播到c到b传播到a。

  • 问题内容: 我是C程序员,最近刚学习一些Java,因为我正在开发一个Android应用程序。目前,我处于一种情况。以下是一个。 现在,我希望在另一个类的其他地方使用方法MyMethod()的调用。如果有人可以为我提供一些代码片段,如何将异常传播到MyMethod()的调用者,以便可以在调用者方法的对话框中显示它们。 对不起,如果我对这个问题的回答不太清楚和奇怪。 问题答案: 只是首先不要捕获异常,

  • 我正在阅读Scala 2.11.8留档的函数在scala.concurrent.Future模块,它说: 将副作用函数应用于这个未来的结果,并返回一个包含这个未来的结果的新的未来。 这个方法允许强制回调以指定的顺序执行。 请注意,如果其中一个链式第四个回调引发异常,则该异常不会传播到后续的第四个调用。相反,随后的第四次回调将被赋予此未来的原始值。 我不确定< code >和不传播异常到底是什么意思

  • 如果一个函数不能抛出异常,或者一个程序并没有接获某个函数所抛出的异常并进行处理,那么这个函数可以用新的noexcept关键字对其进行修饰,表示这个函数不会抛出异常或者抛出的异常不会被接获并处理。例如: extern "C" double sqrt(double) noexcept; // 永远不会抛出异常 vector my_computation(const vector& v) noe