2015-11-07 7 views
8

JSONSerialization.data(withJSONObject:options:) (Swift 2'de dataWithJSONObject) throws olarak bildirilmiştir. Daha sonra, “atar”Hangi koşullar altında JSONSerialization.data (withJSONObject :) birlikte bir hata attı?

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

Neden bu yöntem bildirildi: Ancak, geçersiz nesneler geçen bir çarpışma değil, bir catchable hata neden olur? Hangi koşullar altında bir istisna atar?

Bir hatanın neden atılmasının nedenini bilmemek, hatanın nasıl işleneceğini bilmeyi zorlaştırır ve bu işlemin gerçekleştirildiğini doğrulayan testleri yazmayı imkansız hale getirir.

cevap

6

Bu, this question ile aynı durumu ortaya çıkarır: geçersiz unicode (hangi ?!) içeren bir Swift dizesi oluşturabilir ve bu bir istisna oluşturur.

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

Neden sonra, yerine de bir hata orijinal soru kazasında örnek kod atma nedir? Bir hata raporu yanıtlama

Apple nesne encodable olduğundan emin değiliz eğer data(withJSONObject:) önce JSONSerialization.isValidJSONObject(_:) çağırmalıdır beni bilgilendirdi, bunu yapmadığı API kötüye kullanımıdır ve onlar karar bu yüzden catchable bir şey atmak yerine çökmek gerekir.

+0

Bu, "JSONSerialization bir hatayı hangi koşullar altında yapar" sorusunu yanıtlamaz. Ben soruyu uzatabilir ve "JSONSerialization atmak ne hata yapar" diye sorardım. Şimdiye kadar, bunu hiçbir yerde sınıf belgelerinde görmedim. – BTRUE

+0

@BTRUE: Bu cevap (1), JSONSerialization'un bir hata attığı, (2) bu koşulların yeniden üretilmesi için gereken kodu sağladığını ve (3) Apple'ın diğer bazı başarısızlık koşullarının neden atılmadığına ilişkin açıklamasını geçtiği kesin koşulları verir. Başka ne istediğini bilmiyorum. –

+0

Sanırım istisna ve hata kafa karıştırıcı olabilirsiniz. Kilitlenme oluyor çünkü bir istisna kaldırılıyor. Metodu bir hata atıyorsa, yayılabilir. Onlar iki farklı şey. Ne ve düşündüm ki, bulmaya çalışıyordum, ne tür hatalar atıyor ve ne zaman atıyor. Bir istisna görüyorsun, bir hata değil. – BTRUE