我对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?
在这种情况下没有发现异常吗?
答案 0 :(得分:4)
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)。