2013-05-11 193 views
3

我有CustomException類,這是一個在Exception類之上的包裝。這是我處理異常時使用的主要類。引發另一個異常的異常

public class CustomException : Exception 
{ 
    public string ErrorMessage { get; private set; } 
    public HttpStatusCode HttpStatusCode { get; private set; } 

    public CustomException(string errorMessage) 
     : this(errorMessage, HttpStatusCode.InternalServerError) 
    { } 

    public CustomException(string message, HttpStatusCode httpStatusCode) 
    { 
     ErrorMessage = message; 
     HttpStatusCode = httpStatusCode; 
    } 
} 

當我想拋出異常,我使用throw CustomException()方法。

不過,我想創建這個CustomException(頂部一些包裝)爲好,例如:

public class ApplicationNotFoundException : Exception 
{ 
    public ApplicationNotFoundException(Application application) 
    { 
     string message = string.Format(@"Application ""{0}"" was not found", application.ApplicationName); 
     throw new CustomException(message, HttpStatusCode.NotFound); 
    } 
} 

而且我拋出異常行這樣的:throw new ApplicationNotFoundException(application)

基本上我拋出一個異常從另一個例外。

這種方法不好嗎?

回答

2

派生ApplicationNotFoundException這基本上是不使用exceptions的辦法。
創建自定義exceptions可滿足您的自定義需求,如果內置的異常無法處理此問題。
有一些方法,供您:

  1. 創建例外的層次結構,其中CustomException是你的「基地」類和ApplicationNotFoundException是派生之一,這是一家專業的首選方式。

  1. 嵌入你需要到您的自定義異常類(創建小struct■如果你只是想發送一些信息,並且不需要特定對象的工作本身)的信息

編輯

而且,這是非常重要的,考慮stack unwinding作爲效率因素。拋出異常會強制調用堆棧解開,這也需要一點時間!

當然,你可以這樣做,但它可能會收緊一些東西,這可能是不必要的。

對於某些背景知識,請考慮MSDN

+0

+1,ApplicationNotFoundException應該派生自CustomException – 2013-05-11 10:18:19

+0

@ bash.d:'ApplicationNotFoundException'派生自'CustomException'的唯一缺點是我無法在'ApplicationNotFoundException'構造函數體內創建異常文本 – Catalin 2013-05-11 10:20:47

+0

@RaraituL你不能?爲什麼不?? – 2013-05-11 10:22:42

2

ApplicationNotFoundException的用戶決定什麼時候適合扔。
不要在ApplicationNotFoundException的構造函數中執行此操作。

而是從CustomException

public class ApplicationNotFoundException : CustomException 
{ 
    public ApplicationNotFoundException(Application application) 
    { 
     string message = string.Format(@"Application '{0}' was not found", application.ApplicationName); 
     base.ErrorMessage = message 
     base.HttpStatusCode = HttpStatusCode.NotFound; 
    } 
} 

public class CustomException : Exception 
{ 
    public string ErrorMessage { get; internal set; } 
    public HttpStatusCode HttpStatusCode { get; internal set; } 

    public CustomException(string errorMessage) 
     : this(errorMessage, HttpStatusCode.InternalServerError) 
    { } 

    public CustomException(string message, HttpStatusCode httpStatusCode) 
    { 
     ErrorMessage = message; 
     HttpStatusCode = httpStatusCode; 
    } 
} 
+0

這意味着我首先初始化'ApplicationNotFoundException'類,然後我扔它? – Catalin 2013-05-11 10:29:55

+0

是的,當你需要拋出異常時,你調用'throw new ApplicationException(appInstance);' – Steve 2013-05-11 12:10:42

1

一個常見的場景是重新拋出你更具體的異常類型,而在catch塊比在構造函數中:

try { 
    ... // Try to find application 
} 
catch(ApplicationNotFoundException ex) { 
    var message = ...; 
    throw new CustomException(message, HttpStatusCode.NotFound); 
} 

當重新拋出一個不同的異常,可以設置與原來的異常InnerException屬性以幫助調試。