抛出另一个异常的异常

时间:2013-05-11 10:06:07

标签: c# asp.net exception exception-handling

我有一个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)

基本上我从另一个异常中抛出异常。

这种做法不好吗?

3 个答案:

答案 0 :(得分:2)

ApplicationNotFoundException的用户决定何时投掷。
不要在ApplicationNotFoundException的构造函数中执行此操作。

而是从CustomException

派生ApplicationNotFoundException
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;
    }
}

答案 1 :(得分:2)

这基本上不是使用exceptions的方法 创建自定义exceptions可满足您的自定义需求,如果内置异常无法处理此问题 有一些方法可供你使用:

  1. 创建例外层次结构,其中CustomException是您的“基础”类,而ApplicationNotFoundException是派生类,这是专门化的首选方式。
    1. 将您需要的信息嵌入到自定义异常类中(如果您只想发送一些信息而不需要处理特定对象本身,请创建小struct)。
    2. 修改

      另外,这非常重要,请将stack unwinding视为效率因素。抛出一个异常会强制解除调用堆栈,这也需要一点时间!

      当然,你可以按自己的方式行事,但可能会收紧一点,这可能是不必要的。

      对于某些背景,请考虑MSDN

答案 2 :(得分:1)

常见的情况是重新抛出更具体的异常类型,而不是在catch块中而不是在构造函数中:

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

当重新抛出另一个异常时,可以使用原始异常设置InnerException属性以帮助调试。