捕获基数但不是子例外

时间:2015-03-10 21:58:00

标签: c# exception

我正在编写一个HttpHandler,作为内部设计的一部分,我抛出不同的异常并在顶层捕获它们,以确定将请求设置为什么状态代码。

即。 ArgumentException触发错误请求
AuthenticationException触发未经授权的 OracleException触发InternalServerError

我发现的问题是我使用InvalidOperationException来触发NotFound,但是我的代码中的一个错误让我意识到,当然,一些系统异常会继承这些基本系统异常,从而导致意外的响应。 / p>

即。我发现ObjectDisposedException继承自InvalidOperationException,这意味着响应返回404而不是500.

有没有办法只捕获基本异常?

我发现this thread表示我可以进行过滤和重新抛出,但这看起来很糟糕。

仅仅创建自己的异常类型以节省所有这些麻烦,我会更好吗?

3 个答案:

答案 0 :(得分:2)

如果您只想将HTTP结果代码(可能是错误消息行)传递给客户端,那么我建议您创建单个自定义异常:

public class MyCustomException : Exception { // Or maybe InvalidOperationException
    public int StatusCode {get;set;}
    public string Status {get;set;}
}

答案 1 :(得分:0)

据我所知,没有办法捕获异常,但没有捕获继承的异常。问题在于,您认为基本异常比继承异常更具体,这与它们的工作方式相反(继承异常应该是其父类的更具体的子集,因此在概念上如果你可以处理父项,你应该能够处理继承的异常。)

您的选择基本上是:

  1. 创建自己的例外类型&只抓住这个。如果您的例外属于InvalidOperationException的定义,那么您可以从此继承。然后你可以特别抓住你的。
  2. 如果不是您之后的事情,请抓住,检查并重新投掷。这种技术我通常会尽量避免,但有时需要异常类型过于通用。 e.g。

    catch (InvalidOperationException ex) { 
       if (ex.GetType() != typeof(InvalidOperationException)) throw;
       /* Do stuff */
    }
    

答案 2 :(得分:0)

不可能仅捕获基本异常。

在这种情况下,最好创建一个自定义异常,而不是使用系统的异常类型。

public class HttpErrorException : Exception
{
    public HttpStatusCode StatusCode { get; private set; }
    public HttpErrorException(HttpStatusCode code, string message)
        : base(message)
    {
        this.StatusCode = code;
    }
}

throw new HttpErrorException(400, "You sent a bad request!");

如果最初的目的是混淆HTTP状态代码,而是使用它们的文本名称,则可以创建工厂方法。

public class HttpErrorException : Exception
{
    public HttpStatusCode StatusCode { get; private set; }

    private HttpErrorException(HttpStatusCode code, string message)
        : base(message)
    {
        this.StatusCode = code;
    }

    public static HttpErrorException BadRequest(string message)
    {
        return new HttpErrorException(400, message);
    }

    public static HttpErrorException InternalServerError(string message)
    {
        return new HttpErrorException(500, message);
    }
    // etc
}

throw HttpErrorException.BadRequest("You made a bad request!");