JSONSerialization.data(withJSONObject:options:)
(在Swift 2中称为dataWithJSONObject
)被声明为throws
。但是,传递无效对象会导致崩溃,而不是导致错误的错误:
do {
// Crash
try JSONSerialization.data(
withJSONObject: NSObject(),
options: [])
}
catch
{
// Never reached
print("Caught error:", error)
}
为什么该方法被声明为“抛出”呢?在什么情况下会抛出异常?
不知道导致错误的原因使得很难知道如何处理错误,并且无法编写验证处理错误的测试。
答案 0 :(得分:7)
原来它与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)
}
为什么原始问题中的示例代码会崩溃,而不是抛出错误?
回复错误报告时,Apple告诉我如果您不确定该对象是否可编码,则应在JSONSerialization.isValidJSONObject(_:)
之前致电data(withJSONObject:)
,否则将无法使用API,这就是为什么他们认为它应该崩溃而不是抛出可捕捉的东西。