我正在使用ExceptionLogger
和ExceptionHandler
的专门实现来开发ASP.NET WebApi,但我对这两个类有一些疑问。通过使用ExceptionHandler
类向客户端返回一些自定义响应消息,因此在控制器或服务层上可能出现的每个异常中都会在此类中处理它。
我的第一个问题是,它可以替换控制器上的所有try/catch
块吗?
文档说ExceptionHandler
是一个全局过滤器,它总是被触发。
我的另一个疑问是,是否可以捕获此类中的404(未找到)错误。我试过但我无法抓住它。
感谢。
答案 0 :(得分:1)
我建议您使用Global.asax
和Application_Error
来捕获所有错误。
你不能在这个主题上使用处理程序类,因为处理程序总是在输入你的应用程序之前发生,你可以使用处理程序来格式化输出。
link:https://msdn.microsoft.com/en-us/library/ms227675(v=vs.100).aspx
但是除了特定情况外,建议删除其他类中的try catch。 (这是正确的)
对于404,我建议您在配置中使用web.config和customerror节点,或在c#中使用filter exception
。
答案 1 :(得分:0)
可以替换控制器上的所有try / catch块
是的,你可以。但我更喜欢在异常中添加更多自定义信息并重新抛出它以便它有更多有用的信息。
404未找到
对于全球unhandled exception
,我使用 ELMAH 进行日志记录。它还可以捕获404 not found
并记录它。
配置简单易用
链接:https://code.google.com/p/elmah/
如果您使用IIS
来托管,还可以在那里自定义404
错误页面。
答案 2 :(得分:0)
我没有在控制器中放置try / catch块。您不会显示任何代码,但作为替代方案,您可能需要尝试此操作。使用从ExceptionFilterAttribute继承的自定义异常属性。基本上,它处理异常并将HttpResponseException返回给客户端。
这是属性:
public class HandleExceptionAttribute : ExceptionFilterAttribute
{
private HttpStatusCode _status;
private Type _type;
public Type Type
{
get { return _type; }
set { _type = value; }
}
public HttpStatusCode Status
{
get { return _status; }
set { _status = value; }
}
public override void OnException(HttpActionExecutedContext context)
{
var exception = context.Exception;
if (exception == null || exception.GetType() != Type) return;
var response = context.Request.CreateErrorResponse(Status, exception.Message, exception);
throw new HttpResponseException(response);
}
}
以下是用法:
[HandleException(Type = typeof (ArgumentNullException), Status = ttpStatusCode.InternalServerError)]
public class MyController : ApiController
{
//...
}