2015-11-07 8 views
8

JSONSerialization.data(withJSONObject:options:) (aka dataWithJSONObject in Swift 2) ist throws deklariert. Allerdings ungültige Objekte vorbei verursacht einen Absturz, kein abfangbare Fehler:Unter welchen Umständen verursacht JSONSerialization.data (withJSONObject :) einen abfangbaren Fehler?

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

Warum ist diese Methode deklariert „wirft“, dann? Unter welchen Umständen wirft es eine Ausnahme?

Wenn Sie nicht wissen, wodurch ein Fehler ausgelöst wird, ist es schwierig zu wissen, wie mit dem Fehler verfahren wird, und es ist nicht möglich, Tests zu schreiben, die diese Behandlung bestätigen.

Antwort

6

Stellt sich heraus, es ist die gleiche Situation wie this question: Sie können eine Swift-Zeichenfolge erstellen, die ungültige Unicode enthält (was ?!), und das verursacht eine Ausnahme.

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

Warum wird der Beispielcode in der ursprünglichen Frage Absturz, dann, anstatt zu werfen, auch einen Fehler entdeckt?

auf einen Fehlerbericht beantworten, Apfel mich darüber informiert, dass Sie JSONSerialization.isValidJSONObject(_:) vor data(withJSONObject:) nennen sollen, wenn Sie sicher wissen nicht, dass das Objekt codierbar ist, das zu tun, andernfalls ist ein Missbrauch der API, und das ist, warum sie beschlossen es sollte crashen statt etwas abfangbar zu werfen.

+0

Dies beantwortet nicht die Frage "unter welchen Umständen verursacht JSONSerialization einen Fehler". Ich würde die Frage erweitern und fragen: "Welche Fehler wirft JSONSerialization". Bisher habe ich das nirgends in der Klassendokumentation gesehen. – BTRUE

+0

@BTRUE: Diese Antwort (1) gibt die genauen Bedingungen an, unter denen JSONSerialization einen Fehler auslöst, (2) stellt Code zur Verfügung, um diese Bedingungen zu reproduzieren, und (3) gibt Apples Erklärung weiter, warum einige andere Fehlerbedingungen nicht ausgelöst werden. Ich weiß nicht, was du sonst noch willst. –

+0

Ich denke, Sie können Ausnahme und Fehler verwirren. Der Absturz geschieht, weil eine Ausnahme ausgelöst wird. Wenn die Methode einen Fehler verursacht, wäre sie abfangbar. Sie sind zwei verschiedene Dinge. Was ich, und ich dachte du, versuchte herauszufinden, welche Fehler die Methode werfen kann und wann sie sie wirft. Sie sehen die Ausnahme, keinen Fehler. – BTRUE

Verwandte Themen