【发布时间】:2017-03-19 23:30:52
【问题描述】:
我试图了解为什么我无法捕获 NSJSONSerialization 引发的错误。
我希望引发和捕获 NSInvalidArgumentException 异常,但应用程序却崩溃了。
这在使用 Xcode 8 的 Swift 3 和 Swift 2.3 中都会发生。
斯威夫特 3:
do {
_ = try JSONSerialization.data(withJSONObject: ["bad input" : NSDate()])
}
catch {
print("this does not print")
}
Swift 2.3:
do {
_ = try NSJSONSerialization.dataWithJSONObject(["bad input" : NSDate()], options: NSJSONWritingOptions())
}
catch {
print("this does not print")
}
这段代码放在一个空白 Xcode 项目中的 applicationDidFinishLaunching 中。在模拟器和设备上测试。
完全例外:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__NSDate)'
任何想法为什么 catch 块没有捕捉到这个特定的错误?
【问题讨论】:
-
do/try/catch 捕获 swift 错误,而不是 Objective-c 异常。
-
这是一个编程错误。它应该崩溃。
NSDate不是有效的 JSON 类型。修复编程错误。 -
我正在制作一个接受 JSON 对象作为参数的 API,所以我在编译时不知道它会得到什么输入。看起来唯一的解决方案是连接到 Objective-C 领域以捕获那里的异常。我也会考虑使用
isValidJSONObject。 -
我只是不明白为什么我在网上看到的所有教程都为此使用 do/catch 模式。 Swift catch 块是否会捕获来自 NSJSONSerialization 的任何类型的错误?
-
所有教程都使用
try,因为dataWithJSONObject被声明为throws。不幸的是,文档非常模糊。关于“内部错误”的一些事情。但是使用isValidJSONObject是您想要的,因为它可以避免NSInvalidArgumentException问题。无需桥接到 Objective-C。
标签: ios swift foundation