2010-03-04 92 views
0

我創建類,它異常類型的構造函數傳遞如何拋出自定義異常時,異常的類型被構造

private readonly Exception _exception; 

    public StringToObject(Exception exception) 
    { 
     _exception = exception; 
    } 

我想拋出異常

throw new _exception(""); 

,但我得到的錯誤: '._exception'是'字段',但用於'類型'

是否有任何可能的方式來拋出它?

回答

4

這根本不是一個好習慣。否則會導致您丟失堆棧跟蹤相關信息。請考慮閱讀埃裏克利珀的博客本節:

Too Much Reuse

當你寫

throw new Exception(); 

你實例化這個新的異常。但是,由於你的私有成員_exception已經被實例化,所以你不需要重新實例化它,這是實例化一個實例,這是沒有意義的。相反,使用以下內容:

throw _exception; 

這將做到這一點。

+0

對於太多重用鏈接+1 – 2010-03-04 23:20:31

2
throw _exception; 
+1

請注意,執行此操作將從用於首先創建此對象的異常中失去原始調用堆棧,從而限制其值。 – Nick 2010-03-04 20:22:50

3

重新拋出現有的異常一樣,使用

throw _exception; 

然而,將修改調用堆棧在異常實例,那麼你就失去了異常的原始來源。如果你想避免這種情況,你可以用實例拋出一個新的異常作爲內部異常。

0

這個例子應該工作。我已經包含了這個例子中涉及的所有類。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    public class MyException : Exception 
    { 
     public MyException(string message) : base(message) 
     {} 

     //... 
    } 

    public class MyClass 
    { 
     private Exception exception; 

     public MyClass(Exception e) 
     { 
      this.exception = e; 
     } 

     public void ThrowMyException() 
     { 
      throw exception; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyException myExceptionInstance = new MyException("A custom message"); 
      MyClass myClassInstance = new MyClass(myExceptionInstance); 


      myClassInstance.ThrowMyException(); 

     } 
    } 
} 
0

我懷疑你真正尋找的是扔您建議的類型的新的異常,在這種情況下,「類型」參數傳遞(甚至使用通用的)會是未來的方向。但是,我無法想象這種情況下,這是一個明智的設計選擇,所以我不得不敦促您重新考慮(也許發佈更多的需求,以便有人可以提出更好的選擇!)。

3

我其實很困惑你爲什麼要這麼做?您是否嘗試創建自定義異常以提供更多信息?如果是這樣,那麼你想使用這種模式。

首先定義一個自定義異常類,從異常派生:

public class MyCustomException : Exception // Or you could derive from ApplicationException 
{ 
    public MyCustomException(string msg, Exception innerException) 
    : base(msg, innerException) 
    { 
    } 
} 

你也可以在你的自定義異常的構造函數定義額外的參數,如果你想包含更多的信息。然後,在應用程序代碼...

public void SomeMethod() 
{ 
    try 
    { 
     // Some code that might throw an exception 
    } 
    catch (Exception ex) 
    { 
     throw new MyCustomException("Additional error information", ex); 
    } 
} 

你會想一定要保持內部異常的軌道,因爲這將有什麼擺在首位導致異常的最有用的調用堆棧信息。

相關問題