尝试?传播而不是返回零

时间:2017-05-09 05:07:19

标签: ios swift error-handling optional

我对try?的理解是,当评估try?之后的表达式时,如果存在异常,将返回nil,否则将返回该函数的返回值。

当我运行以下代码时:

guard let istream = InputStream(url: url),
      let ambiguousObj = try? JSONSerialization.jsonObject(with: istream, options: []),
      let jsonObj = ambiguousObj as? [[String: Any]] else {
    throw ExportError.recoveredParseFailed
}

我收到与上面第二行有关的错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization JSONObjectWithStream:options:error:]: stream is not open for reading'

我了解如何解决错误。(我需要致电istream.open()

但是,有人可以帮助我理解为什么try?在这种情况下没有发现异常吗?

1 个答案:

答案 0 :(得分:4)

如果抛出Swift 错误

try?会对表达式求值并返回nil 在评估期间。在您的情况下,基金会库会抛出 一个Objective-C NSException,如果设置了一个异常断点就可以看到:

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x00007fffbe5cb45d libobjc.A.dylib`objc_exception_throw
    frame #1: 0x00007fffa9855c3d CoreFoundation`+[NSException raise:format:] + 205
    frame #2: 0x00007fffab3a001a Foundation`+[NSJSONSerialization JSONObjectWithStream:options:error:] + 178

Objective-C异常无法在Swift中被捕获(除非你 使用Objective-C包装器,例如参见Catching NSException in Swift)。