我很快就遇到了这种愚蠢的行为,在这种行为中,强制展开可选对象不会传播。
从文档中:
尝试使用!访问不存在的可选值会触发运行时错误。在使用!之前,请始终确保可选内容包含非nil值。强制释放其价值。
复制:
func foo(bar:String?) throws{ print(bar!); }
和
try foo(nil);
这对我来说似乎不合逻辑或前后不一,我找不到有关此主题的任何文档。
这是设计使然吗?
错误处理 错误处理是响应程序错误状态并从错误状态中恢复的过程。Swift在运行时为抛出,捕获,传播和操作可恢复错误提供了一流的支持。 … 表示和抛出错误 在Swift中,错误由符合ErrorType协议的类型的值表示。此空协议表示可以将类型用于错误处理。
错误处理
错误处理是响应程序错误状态并从错误状态中恢复的过程。Swift在运行时为抛出,捕获,传播和操作可恢复错误提供了一流的支持。
…
表示和抛出错误
在Swift中,错误由符合ErrorType协议的类型的值表示。此空协议表示可以将类型用于错误处理。
ErrorType
(注意:ErrorType已Error在Swift 3中重命名为)
Error
因此,随着try/catch您处理n的 Swift错误 (符合ErrorType协议的类型的值)throw。这与运行时错误和运行时异常完全无关(也与NSExceptionFoundation库无关)。
try/catch
throw
NSException
请注意,有关错误处理的Swift文档甚至没有使用“ exception”一词,唯一的例外是(强调我的):
注意 使用try,catch和throw关键字,Swift中的错误处理 类似于 其他语言中的 异常处理 。与许多语言(包括Objective-C)中的异常处理不同,Swift中的错误处理不涉及展开调用堆栈,该过程在计算上可能会非常昂贵。这样,throw语句的性能特征可与return语句的性能特征相媲美。
注意
使用try,catch和throw关键字,Swift中的错误处理 类似于 其他语言中的 异常处理 。与许多语言(包括Objective-C)中的异常处理不同,Swift中的错误处理不涉及展开调用堆栈,该过程在计算上可能会非常昂贵。这样,throw语句的性能特征可与return语句的性能特征相媲美。
可选对象的展开nil不会throw带来Swift错误(可能会传播),因此无法使用进行处理 try。
nil
try
您必须使用众所周知的技术,例如可选绑定,可选链接,对照nil等。