2013-05-11 153 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属性以帮助调试。