Ios 未传播swift force展开异常
我在swift中遇到过这种愚蠢的行为,强制展开可选项不会传播 从文件中: 尝试使用!访问不存在的可选值会触发运行时错误。在使用之前,请始终确保可选项包含非nil值!强制展开其值 复制:Ios 未传播swift force展开异常,ios,swift,swift2,Ios,Swift,Swift2,我在swift中遇到过这种愚蠢的行为,强制展开可选项不会传播 从文件中: 尝试使用!访问不存在的可选值会触发运行时错误。在使用之前,请始终确保可选项包含非nil值!强制展开其值 复制: func foo(bar:String?) throws{ print(bar!); } 及 对我来说,这似乎不符合逻辑或不一致,而且我找不到关于这个主题的任何文档 这是设计的吗?来自: 错误处理 错误处理是响应和恢复错误的过程 程序中的错误条件。Swift提供一流的支持 用于投掷、捕捉、传播和操纵 运
func foo(bar:String?) throws{
print(bar!);
}
及
对我来说,这似乎不符合逻辑或不一致,而且我找不到关于这个主题的任何文档
这是设计的吗?来自:
错误处理
错误处理是响应和恢复错误的过程
程序中的错误条件。Swift提供一流的支持
用于投掷、捕捉、传播和操纵
运行时出错
表示和抛出错误
在Swift中,错误由符合
ErrorType
协议。此空协议表示类型可以
用于错误处理
(注意:ErrorType
在Swift 3中已重命名为Error
)
因此,使用try/catch
可以处理Swift错误(符合ErrorType
协议的类型值),即throw
n。
这与运行时错误和运行时异常完全无关
(与基础库中的<代码> NSExcExc/代码>无关。
请注意,关于错误处理的Swift文档甚至没有使用
“例外”一词,在(强调我的)中只有例外(!):
注
Swift中的错误处理类似于其他系统中的异常处理
语言,使用try、catch和throw关键字。不像
许多语言中的异常处理,包括Objective-C-error
Swift中的处理不涉及展开调用堆栈,这是一个过程
这在计算上可能很昂贵。因此,性能
throw语句的特性与
返回语句
展开nil
的选项不会抛出
a
Swift错误(可以传播),无法使用
试试看
你必须使用众所周知的技术,比如
可选绑定、可选链接、检查
nil
等。此“自解释”示例可以帮助您了解引发运行时异常和引发符合ErrorType协议的错误E之间的区别
struct E: ErrorType{}
func foo(bar:String?) throws {
if let error = bar where error == "error" {
throw E()
}
print(bar, "is valid parameter, but don't try to access bar.characters, it crash your code! (if bar == nil)")
// here is everything OK
let bar = bar!
// but here it crash!!
_ = bar.characters
}
do {
try foo("error")
// next line is not accessible here ...
try foo(nil)
} catch {
print("\"error\" as parameter of foo() throws an ERROR!")
}
do {
try foo(nil) // fatal error: unexpectedly found nil while unwrapping an Optional value
} catch {
}
它打印
"error" as parameter of foo() throws an ERROR!
nil is valid parameter, but don't try to access bar.characters, it crash your code! (if bar == nil)
fatal error: unexpectedly found nil while unwrapping an Optional value
引发运行时异常是代码中的致命错误 我不确定使用
throw
抛出错误(这是导致错误从此类函数中传播的原因)与强制展开nil
时发生的情况是否相同。我想我在某个地方读到过,它被实现为一个assert()
。这可以解释它,但那很糟糕。也许有一个论点支持它,但在一种支持异常的语言中,它似乎不一致。@Greg:Nicolas是对的。请注意,try/catch处理Swift错误(符合抛出的ErrorType
的值)。这与运行时错误或异常完全无关。(文档中甚至没有提到与throw/try/catch相关的“exception”一词,只提到了“错误处理”。)我想很容易将swift错误与异常混淆。大多数其他编程语言都使用类似的关键字(try
/catch
)来处理异常处理。我从未尝试过使用try-to-catch展开,我只讨论它们的传播。但你回答得很好。我遇到的一个用例是使用快速json和解析json。我有一个实体,其中包含一个子实体,该子实体将简单地抛出(传播)json响应中不存在的字段。我现在使用可选的初始值设定项实现同样的功能,但现在还有3行代码:P@Greg:嗯,任何抛出的错误都必须在某个地方捕获。但为了更好地配合你的问题,我改变了措辞。
"error" as parameter of foo() throws an ERROR!
nil is valid parameter, but don't try to access bar.characters, it crash your code! (if bar == nil)
fatal error: unexpectedly found nil while unwrapping an Optional value