我正在编写一个HttpHandler,作为内部设计的一部分,我抛出不同的异常并在顶层捕获它们,以确定将请求设置为什么状态代码。
即。
ArgumentException触发错误请求
AuthenticationException触发未经授权的
OracleException触发InternalServerError
等
我发现的问题是我使用InvalidOperationException来触发NotFound,但是我的代码中的一个错误让我意识到,当然,一些系统异常会继承这些基本系统异常,从而导致意外的响应。 / p>
即。我发现ObjectDisposedException继承自InvalidOperationException,这意味着响应返回404而不是500.
有没有办法只捕获基本异常?
我发现this thread表示我可以进行过滤和重新抛出,但这看起来很糟糕。
仅仅创建自己的异常类型以节省所有这些麻烦,我会更好吗?
答案 0 :(得分:2)
如果您只想将HTTP结果代码(可能是错误消息行)传递给客户端,那么我建议您创建单个自定义异常:
public class MyCustomException : Exception { // Or maybe InvalidOperationException
public int StatusCode {get;set;}
public string Status {get;set;}
}
等
答案 1 :(得分:0)
据我所知,没有办法捕获异常,但没有捕获继承的异常。问题在于,您认为基本异常比继承异常更具体,这与它们的工作方式相反(继承异常应该是其父类的更具体的子集,因此在概念上如果你可以处理父项,你应该能够处理继承的异常。)
您的选择基本上是:
InvalidOperationException
的定义,那么您可以从此继承。然后你可以特别抓住你的。如果不是您之后的事情,请抓住,检查并重新投掷。这种技术我通常会尽量避免,但有时需要异常类型过于通用。 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!");