2009-07-08 56 views
5

當自定義異常處理,我通常從Exception繼承,然後添加一些字段/屬性,我的異常類來存儲一些額外的信息:我應該如何將數據存儲在自定義異常中?

public class MyException : Exception 
{ 
    public int ErrorCode{get;set;} 

    public MyException() 
    {} 
} 

在上面的例子中,ErrorCode值存儲在異常,這意味着如果來自受保護的構造函數中的SerializationInfo對象和重寫的GetObjectData方法,我必須將其添加到並退出。

Exception類有一個Data屬性,它根據MSDN:

獲取一個提供有關異常的用戶定義的其他信息的鍵/值對的集合。

如果我存儲Data裏面的錯誤代碼,它會得到由異常類我序列化(根據反射器),這意味着我的異常類現在看起來像:

public class MyException : Exception 
{ 
    public int ErrorCode 
    { 
     get {return (int) Data["ErrorCode"];} 
     set {Data["ErrorCode"] = value;} 
    } 

    public MyException() 
    {} 
} 

這意味着儘管在處理錯誤代碼的獲取/設置方面還有一些工作要做(例如處理錯誤代碼可能不在字典中的錯誤代碼和錯誤代碼的情況),但我不必擔心序列化/將其解串。

這是隻有兩個達到同樣的事情,不同的方式,還是一種方式有什麼明顯的優勢(S)比其他(除了那些我已經提到過)?

回答

1

我會避免使用數據,因爲它不受您的控制,例如,某處的某些代碼可能會決定覆蓋「ErrorCode」值。而是使用propery並實現序列化。我使用下面的代碼來測試我所有的自定義異常,以確保我已正確實施它們。

public static void TestCustomException<T>() where T : Exception 
{ 
    var t = typeof(T); 

    //Custom exceptions should have the following 3 constructors 
    var e1 = (T)Activator.CreateInstance(t, null); 

    const string message = "message"; 
    var e2 = (T)Activator.CreateInstance(t, message); 
    Assert.AreEqual(message, e2.Message); 

    var innerEx = new Exception("inner Exception"); 
    var e3 = (T)Activator.CreateInstance(t, message, innerEx); 
    Assert.AreEqual(message, e3.Message); 
    Assert.AreEqual(innerEx, e3.InnerException); 

    //They should also be serializable 
    var stream = new MemoryStream(); 
    var formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, e3); 
    stream.Flush(); 
    stream.Position = 0; 
    var e4 = (T)formatter.Deserialize(stream); 
    Assert.AreEqual(message, e4.Message); 
    Assert.AreEqual(innerEx.ToString(), e4.InnerException.ToString()); 
} 
0

您應該使用第一個解決方案。除非您計劃使用附加信息提升行異常實例,否則我無法在Data屬性中看到很多值。

如果你有自己的異常類型,然後使用屬性,而不是:這是更清潔和安全。

1

Microsoft's own guidelines

不要做出例外序列化。必須序列化異常才能跨應用程序域和遠程邊界正確工作。

我將其存儲在數據財產黯然將讓外部的代碼修改值未經同意,或使用的解決方案1(在你的例子),但使之可序列化。最後,我可能會去解決方案1,所以我可以肯定,值永遠不會改變。

5

如果您費心去創建自己的異常,你不需要數據屬性。當您想要在現有的異常類中存儲一些額外的信息時,數據非常有用,但不希望創建您自己的自定義異常類。

相關問題