2011-03-15 102 views
21

我目前正在學習C#,但是我被困在某些東西上,而我找不到解決方案。
我想創建自己的Exception類。如何創建一個自定義的C#異常?

這個異常被稱爲「InvalidNumberException」,它檢查一個數是否等於5.我知道它可能看起來有點愚蠢,但我只需要了解有關創建自定義異常的想法。

到目前爲止,我在MSDN上發現,用於創建例外,我需要這四個構造函數:

public class InvalidNumberException : System.Exception 
{ 
    public InvalidNumbertException() : base() { } 
    public InvalidNumberException(string message) : base(message) { } 
    public InvalidNumberException(string message, System.Exception inner) : base(message, inner) { } 

    // A constructor is needed for serialization when an 
    // exception propagates from a remoting server to the client. 
    protected InvalidNumberException(System.Runtime.Serialization.SerializationInfo info, 
     System.Runtime.Serialization.StreamingContext context) { } 
} 

,但我不知道如何實現從輸入的數字在這個類中的方法或構造控制檯等於5,如果不是,則會引發異常。

如果有人能幫助我,我將不勝感激。

+0

OT,你不應該自己寫四個構造函數。只需實施你需要的。 ''public class InvalidNumberException:Exception {}'should should work if if you do you all-to要做的事就是拋出new InvalidNumberException();' – 2011-03-15 22:18:12

+2

值得注意的是,除非真的需要,否則不應該創建自定義異常。首先仔細想一想。請參閱http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx – 2013-01-14 13:03:07

回答

22

你並不需要所有這些構造函數。想想你正在創建的例外 - 確保int!=5

所以,我想有一個單獨的構造是這樣的:

public InvalidNumberException(int value) 
    : base(String.Format("Some custom error message. Value: {0}", value)) { } 

而且使用這樣的:

if (number == 5) 
    throw new InvalidNumberException(number); 

你不應該包裹在一個try塊。這是執行上面的代碼塊來監視異常代碼的工作,如:

try 
{ 
    CallSomeMethodWhichChecksTheNumberAndThrowsIfNecessary(); 
} 
catch (InvalidNumberException inex) 
{ 
    // do something, print to console, log, etc 
} 

我希望這僅僅是靠在因爲用於此目的的Int32.ParseInt32.TryParse方法 - 自定義異常班級不是必需的。

27

異常本身不應該檢查。相反,無論你有什麼代碼與數字一起工作,都應該這樣做。嘗試是這樣的:

if (number == 5) 
    throw new InvalidNumberException(); 
+0

您可能希望將該號碼傳遞給例外顯示有意義的消息。 – 2011-03-15 22:17:33

+0

他正在討論檢查例外內的號碼。它顯示的消息是不相關的。 – 2011-03-15 22:20:55

4

通過投擲它暗示你在某些特定情況下的程序說,它不能正常運行,必須中止異常。你這樣做,像這樣:

if (conditionMet) 
    throw new Exception(); 

更具體地講,您可以像使用InvalidOperationException異常,NullReferenceException異常等更具體的例外有時你可能需要使用更加具體的異常,當你創建自己的異常類型這通過從System.Exception基礎派生。將您創建的自定義異常看作是您的程序所具有的條件的容器。在你的情況下,條件是已經傳遞了一個無效的數字,所以你創建了一個你使用的InvalidNumberException容器,而不是上面的通用異常。

每當CLR執行您的「throw new」語句時,它將中止當前代碼路徑的執行,並將查找可處理該異常的catch語句。

所以,你的代碼可能是這樣的:

try 
{ 
    if (number == 5) 
     throw new InvalidNumberException(); 
} 
catch (InvalidNumberException e) 
{ 
    System.Console.WriteLine("Hey I got an InvalidNumberException"); 
} 
8

接受的答案是錯誤的!

從接受的答案:

public InvalidNumberException(int value) 
{ 
    var message = string.Format("Some custom error message. Value: {0}", value); 
    base(message, this.InnerException) 
} 

這是一個更好的方式來做到這一點:

public InvalidNumberException(int value) : base(string.Format("Some custom error message. Value: {0}", value)) { } 
+0

你能解釋爲什麼接受的答案是錯誤的嗎? – numaroth 2015-03-06 16:54:42

+2

已接受的答案已被編輯爲使用此代碼 – 2015-03-06 17:29:50

0

它不一定是真正的所有拋出的異常是錯誤的,這將導致放棄你應用程序 - 只要它們被捕獲而不會滲透,那就是;)。

在無效號碼輸入的情況下,您可能會收到異常,然後提示用戶他輸入了無效號碼,請記錄有效號碼的規則,並要求其重新輸入號碼。如果用戶爲數據庫帳戶輸入了拼寫錯誤的密碼或連接字符串,並且發生了SqlException或其他可糾正的錯誤,則情況也是如此。