我很快就遇到了这种愚蠢的行为,在这种行为中,强制展开可选对象不会传播。
从文档中:
尝试使用!访问不存在的可选值会触发运行时错误。在使用!之前,请始终确保可选内容包含非nil值。强制释放其价值。
复制:
func foo(bar:String?) throws{
print(bar!);
}
和
try foo(nil);
这对我来说似乎不合逻辑或前后不一,我找不到有关此主题的任何文档。
这是设计使然吗?
从文档中:
错误处理
错误处理是响应程序错误状态并从错误状态中恢复的过程。Swift在运行时为抛出,捕获,传播和操作可恢复错误提供了一流的支持。
…
表示和抛出错误
在Swift中,错误由符合
ErrorType
协议的类型的值表示。此空协议表示可以将类型用于错误处理。
(注意:ErrorType
已Error
在Swift 3中重命名为)
因此,随着try/catch
您处理n的 Swift错误
(符合ErrorType
协议的类型的值)throw
。这与运行时错误和运行时异常完全无关(也与NSException
Foundation库无关)。
请注意,有关错误处理的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