Eri*_*gas 7 foundation ios swift
我试图理解为什么我无法捕捉到NSJSONSerialization引发的错误.
我希望NSInvalidArgumentException引发异常并将其捕获,但应用程序崩溃了.
使用Xcode 8在Swift 3和Swift 2.3中都会发生这种情况.
斯威夫特3:
do {
_ = try JSONSerialization.data(withJSONObject: ["bad input" : NSDate()])
}
catch {
print("this does not print")
}
Run Code Online (Sandbox Code Playgroud)
Swift 2.3:
do {
_ = try NSJSONSerialization.dataWithJSONObject(["bad input" : NSDate()], options: NSJSONWritingOptions())
}
catch {
print("this does not print")
}
Run Code Online (Sandbox Code Playgroud)
此代码放在applicationDidFinishLaunching一个空白的Xcode项目中.在模拟器和设备上进行测试.
完全例外:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__NSDate)'
Run Code Online (Sandbox Code Playgroud)
任何想法为什么catch块没有捕获这个特定的错误?
rma*_*ddy 11
从以下文档JSONSerialization data(withJSONObject:options:):
如果obj不会生成有效的JSON,则抛出异常.在解析之前抛出此异常并表示编程错误,而不是内部错误.在使用isValidJSONObject(_ :)调用此方法之前,应检查输入是否将生成有效的JSON.
这意味着您无法捕获由无效数据导致的异常.只有"内部错误"(无论实际意味着什么)才能在catch块中捕获.
为了避免可能NSInvalidArgumentException需要使用isValidJSONObject.
然后你的代码变成:
do {
let obj = ["bad input" : NSDate()]
if JSONSerialization.isValidJSONObject(obj) {
_ = try JSONSerialization.data(withJSONObject: obj)
} else {
// not valid - do something appropriate
}
}
catch {
print("Some vague internal error: \(error)")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |