Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 未传播swift force展开异常_Ios_Swift_Swift2 - Fatal编程技术网

Ios 未传播swift force展开异常

Ios 未传播swift force展开异常,ios,swift,swift2,Ios,Swift,Swift2,我在swift中遇到过这种愚蠢的行为,强制展开可选项不会传播 从文件中: 尝试使用!访问不存在的可选值会触发运行时错误。在使用之前,请始终确保可选项包含非nil值!强制展开其值 复制: func foo(bar:String?) throws{ print(bar!); } 及 对我来说,这似乎不符合逻辑或不一致,而且我找不到关于这个主题的任何文档 这是设计的吗?来自: 错误处理 错误处理是响应和恢复错误的过程 程序中的错误条件。Swift提供一流的支持 用于投掷、捕捉、传播和操纵 运

我在swift中遇到过这种愚蠢的行为,强制展开可选项不会传播

从文件中:

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

复制:

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