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)

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

这种方法不好吗?

4

3 回答 3

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;
    }
}
于 2013-05-11T10:11:19.693 回答
2

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

  1. 创建一个异常层次结构,其中CustomException是您的“基”类并且ApplicationNotFoundException是派生类,这是专门化的首选方式。

或者

  1. 将您需要的信息嵌入到您的自定义异常类中(struct如果您只想发送一些信息并且不需要处理特定对象本身,请创建小 s)

编辑

此外,这是非常重要的,将其视为stack unwinding效率的一个因素。抛出异常会强制释放调用堆栈,这也需要一些时间!

当然,您可以按照自己的方式进行操作,但这可能会使事情变得有些紧张,这可能是不必要的。

对于某些背景,请考虑MSDN

于 2013-05-11T10:13:47.777 回答
1

一个常见的场景是在 catch 块中而不是在构造函数中 重新抛出更具体的异常类型:

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

当重新抛出不同的异常时,您可以将 InnerException 属性设置为原始异常以帮助调试。

于 2013-05-11T10:23:43.067 回答