2014-10-08 228 views

回答

55

JSON.NET定義了以下情況除外:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

序列化和反序列化錯誤通常將導致一個JsonSerializationException

+5

謝謝,但 「典型地」?我怎樣才能確定DeseriazeObject拋出哪些異常? – cja 2014-10-09 10:15:02

+4

@cja,我認爲*它總是會是'JsonSerializationException',但要確保您必須問作者或查看源代碼......無論如何,如果您想成爲「JsonException」一定不要錯過任何東西,因爲所有的JSON.NET異常都會從中繼承。 – 2014-10-09 10:29:57

+62

我認爲例外需要妥善記錄。 – KFL 2015-12-03 19:19:45

27

請注意,Json.NET's error handling documentation顯示了一種API用戶通過處理錯誤事件而不是直接捕獲異常來處理錯誤的策略。當您考慮可能只有一個數組中的某個項目可能無法反序列化時,這是有道理的,您可能希望以比整個集合中的一個整體異常更細化的方式處理此問題。

這個答案解決了「想要處理它們」這個問題的一部分,而沒有得到「什麼是例外」部分。正如另一個答案所示,所有Json.NET異常從JsonException Class繼承,因此捕獲這將是一個很好的故障安全。然而,如果你想真正理解是什麼導致拋出異常,你需要閱讀它的Message屬性,而不是基於Exception類型來處理,因爲不同的類型似乎更關注於你所採取的動作表現比錯誤類別。在示例代碼中,args.ErrorContext.ErrorException類型。從文檔

示例代碼:

List<string> errors = new List<string>(); 

List<DateTime> c = JsonConvert.DeserializeObject<List<DateTime>>(@"[ 
     '2009-09-09T00:00:00Z', 
     'I am not a date and will error!', 
     [ 
     1 
     ], 
     '1977-02-20T00:00:00Z', 
     null, 
     '2000-12-01T00:00:00Z' 
    ]", 
    new JsonSerializerSettings 
    { 
     Error = delegate(object sender, ErrorEventArgs args) 
     { 
      errors.Add(args.ErrorContext.Error.Message); 
      args.ErrorContext.Handled = true; 
     }, 
     Converters = { new IsoDateTimeConverter() } 
    }); 

// 2009-09-09T00:00:00Z 
// 1977-02-20T00:00:00Z 
// 2000-12-01T00:00:00Z 

// The string was not recognized as a valid DateTime. There is a unknown word starting at index 0. 
// Unexpected token parsing date. Expected String, got StartArray. 
// Cannot convert null value to System.DateTime. 
相關問題