2014-04-23 18 views
-1

美好的一天!C#繼承和例外文本

我創建兩個類:

class A 
{ 
    public A(String name) {} 
    public void Func1() 
    { 
     try 
     {...} 
     catch(Exception ex) 
     { 
     Console.WriteLIne("Error at Func1 of class A"+Ex.Message); 
     } 
    } 
} 

class B:A 
{ 
    public B() {} 
} 

在Main()方法:

B b=new B(String name); 
b.Func1(); 

而當異常comes-一個get errror是這樣的: 「錯誤在A級FUNC1」! 因此,它讓我困惑。

如何解決它?我是否應該重寫A類的每個功能,並且這樣做:

void override Func1() 
{ 
    try { 
    _a.Fun1(); 
    } 
    catch(Exception ex) 
    {//My text of exception} 
} 

or impement interface? 請告訴我!

謝謝!

+0

異常_s​​tack trace_已經爲您提供此信息。你確定你想把這個文本放入你的例外嗎?異常消息通常會顯示異常的可疑原因 - 您必須知道出錯的原因才能拋出異常! – Gusdor

+0

聽起來像試驗中發生的任何事情都是拋出與您提供的結構無關的異常。 – Oliver

+0

@Gusdor然而,一個問題是,你會得到方法名稱和方法定義的類。所以堆棧跟蹤將顯示'A.Func1'而不是'B.Func1'。雖然可以理解並且總體上是一個好主意,但OP似乎想要運行的實際類型(這很可能意味着他的繼承樹非常奇怪:D) – Luaan

回答

1

覆蓋是一種選擇,但它很奇怪。

相反,你可以使用this.GetType()來獲取類型的名稱你實際上是:

Console.WriteLine("Error at class " + GetType().Name + ": " + Ex.Message); 

然而,這是一個異常處理有點怪異的圖案。首先,你打印的信息在異常的堆棧跟蹤中,不需要手動寫出方法的名字等等。真的,它有點冗長,但通常很有用。

當然,如果你還是想遵循這種模式,您不必手動編寫方法的名稱:

"Method " + MethodBase.GetCurrentMethod().Name + ", class " + GetType().Name 

這裏的關鍵是,你B類型沒有方法Func1 - 它僅對A的方法Func1進行虛擬調度,並參考其自身。由於GetType()可以獲得給定實例的實際類型(在本例中爲this),所以即使在從基類繼承的類中也可以獲得所需的類型。

覆蓋所有類中的所有方法並替換它們的整個代碼將會完全破壞繼承的目的,不是嗎?

+0

您能告訴我如何編寫例外文本嗎? – user2545071

+1

@ user2545071那麼,這裏的基本思想就是問問自己,誰從消息中受益。它是爲你的應用程序的用戶嗎?他不知道發生這種事的方法和階級的名字。這是給你的嗎?您可能需要完整的堆棧跟蹤,其中還會顯示發生錯誤的行以及調用者樹。另一個重要的事情是問問自己,你是否在正確的地方處理異常。用這種方法處理它是否真的有意義,還是應該傳播得更高?也許你只想'試試...終於'清理? – Luaan