¿En qué circunstancias JSONSerialization.data (con JSONObject :) arroja un error de captura?

JSONSerialization.data(withJSONObject:options:) (también dataWithJSONObject como dataWithJSONObject en Swift 2) es throws declarado. Sin embargo, al pasar objects no válidos se produce un locking, no un error de captura:

 do { // Crash try JSONSerialization.data( withJSONObject: NSObject(), options: []) } catch { // Never reached print("Caught error:", error) } 

¿Por qué se declara "tiros" ese método? ¿Bajo qué circunstancias arroja una exception?

El hecho de no saber qué causa que se lance un error dificulta saber cómo manejar el error y hace que sea imposible escribir testings que verifiquen ese manejo.

Resulta que es la misma situación que esta pregunta : puede crear una cadena Swift que contenga unicode no válido (¿qué ?!), y que provoque una exception.

 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) } 

¿Por qué se bloquea el código de ejemplo en la pregunta original, en lugar de arrojar un error?

Respondiendo a un informe de error, Apple me informó que debería llamar a JSONSerialization.isValidJSONObject(_:) antes de los data(withJSONObject:) si no sabe con certeza que el object es codificable, al no hacerlo es un uso incorrecto de la API , y es por eso que decidieron que debería estrellarse en lugar de arrojar algo atrapable.