作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
JSONSerialization.data(withJSONObject:options:)
(在 Swift 2 中又称为 dataWithJSONObject
)被声明为 throws
。但是,传递无效对象会导致崩溃,而不是可捕获的错误:
do {
// Crash
try JSONSerialization.data(
withJSONObject: NSObject(),
options: [])
}
catch
{
// Never reached
print("Caught error:", error)
}
那么为什么该方法被声明为“throws”呢?什么情况下会抛出异常?
不知道导致错误发生的原因会导致很难知道如何处理错误,并且无法编写验证该处理的测试。
最佳答案
原来是和this question一样的情况: 您可以创建一个包含无效 unicode(什么?!)的 Swift 字符串,这会导致异常。
let bogusStr = String(
bytes: [0xD8, 0x00] as [UInt8],
encoding: String.Encoding.utf16BigEndian)!
do {
let rawBody = try JSONSerialization.data(
withJSONObject: ["foo": bogusStr], options: [])
}
catch
{
// Exception lands us here
print("Caught error:", error)
}
为什么原始问题中的示例代码会崩溃,而不是同时抛出错误?
回复一个错误报告,苹果告诉我你应该调用 JSONSerialization.isValidJSONObject(_:)
之前 data(withJSONObject:)
如果你不知道确保该对象是可编码的,否则就是滥用 API,这就是为什么他们决定它应该崩溃而不是抛出一些可捕获的东西。
关于ios - 什么情况下JSONSerialization.data(withJSONObject :) throw a catchable error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33584492/
JSONSerialization.data(withJSONObject:options:)(在 Swift 2 中又称为 dataWithJSONObject)被声明为 throws。但是,传递无
我是一名优秀的程序员,十分优秀!