一尘不染

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

swift

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

从文档中:

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

复制:

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

try foo(nil);

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

这是设计使然吗?


阅读 197

收藏
2020-07-07

共1个答案

一尘不染

文档中

错误处理

错误处理是响应程序错误状态并从错误状态中恢复的过程。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等。

2020-07-07