2015-11-07 45 views
8

JSONSerialization.data(withJSONObject:options:)(在Swift 2中的dataWithJSONObject)被宣佈爲throws。然而,通過無效對象會導致系統崩潰,而不是開捕錯誤:JSONSerialization.data(withJSONObject :)在什麼情況下會拋出可捕獲的錯誤?

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

爲什麼這個方法聲明「拋出」呢?它在什麼情況下會拋出異常?

不知道是什麼導致錯誤被拋出,這使得很難知道如何處理錯誤,並且使編寫驗證處理的測試成爲不可能。

回答

6

結果與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) 
    } 

爲什麼在原來的問題墜毀的示例代碼,然後,而不是還拋出一個錯誤?

回答一個bug報告,蘋果公司通知我說,你應該叫JSONSerialization.isValidJSONObject(_:)data(withJSONObject:)之前,如果你不能肯定該對象是可編碼做,不能做的是API的誤用,這就是爲什麼他們決定它應該會崩潰而不是拋出可捕獲的東西。

+0

這並不回答「在什麼情況下JSONSerialization拋出錯誤」的問題。我會擴展這個問題並詢問「JSONSerialization拋出什麼錯誤」。到目前爲止,我還沒有看到類文檔中的任何地方。 – BTRUE

+0

@BTRUE:這個答案(1)給出了JSONSerialization引發錯誤的準確條件,(2)提供了重現這些條件的代碼,以及(3)傳遞了蘋果公司解釋爲什麼其他失敗條件不會拋出的原因。我不知道你還想要什麼。 –

+0

我認爲你可能會混淆異常和錯誤。因爲發生異常,正在發生崩潰。如果該方法拋出一個錯誤,它將是可捕獲的。他們是兩個不同的東西。我和我以爲你想要發現的是,這個方法會拋出什麼錯誤,什麼時候拋出它們。你看到的例外,而不是一個錯誤。 – BTRUE

相關問題