我希望引发和捕获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") }
此代码放在applicationDIDFinishLaunching一个空白的Xcode项目中.在模拟器和设备上进行测试.
完全例外:
*** Terminating app due to uncaught exception 'NSinvalidargumentexception',reason: 'InvalID type in JsON write (__NSDate)'
任何想法为什么catch块没有捕获这个特定的错误?
解决方法 从JsONSerialization数据的文档(withJsONObject:options :):If obj will not produce valID JsON,an exception is thrown. This exception is thrown prior to parsing and represents a programming error,not an internal error. You should check whether the input will produce valID JsON before calling this method by using isValIDJsONObject(_:).
这意味着您无法捕获由无效数据导致的异常.只有“内部错误”(无论实际意味着什么)才能在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)")}总结
以上是内存溢出为你收集整理的ios – 在Swift中捕获NSJSONSerialization错误全部内容,希望文章能够帮你解决ios – 在Swift中捕获NSJSONSerialization错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)