【问题标题】:Exception and log handlers in WebApiWebApi 中的异常和日志处理程序
【发布时间】:2015-10-02 22:16:41
【问题描述】:

我正在使用 ExceptionLoggerExceptionHandler 的专门实现来开发 ASP.NET WebApi,但我对这两个类有一些疑问。通过使用ExceptionHandler 类,即时向客户端返回一些自定义响应消息,因此在控制器或服务层上可能发生的每个异常中,它都在此类中处理。 我的第一个问题是,它可以替换控制器上的所有try/catch 块吗? 文档说ExceptionHandler 是一个全局过滤器,它总是被触发。

我的另一个疑问是是否有可能在此类中捕获 404(未找到)错误。我试过了,但我无法抓住它。

谢谢。

【问题讨论】:

    标签: c# asp.net-web-api


    【解决方案1】:

    我建议您使用Global.asaxApplication_Error 来捕获所有错误。 你不能在这个主题上使用处理程序类,因为处理程序总是在进入你的应用程序之前发生,你可以使用处理程序来格式化输出。

    链接:https://msdn.microsoft.com/en-us/library/ms227675(v=vs.100).aspx

    但建议删除其他类中的try catch,特殊情况除外。 (没错)

    对于 404,我建议你在配置中使用 web.config 和 customerror 节点,或者在你的 c# 中使用filter exception

    【讨论】:

      【解决方案2】:

      它可以替换控制器上的所有 try/catch 块

      是的,你可以。但我更喜欢在异常中添加更多自定义信息并重新抛出它,以便它有更多有用的信息。

      404 未找到

      对于全局 unhandled exception,我使用 ELMAH 进行日志记录。它还可以捕获404 not found并记录它。

      配置简单,使用方便

      链接:https://code.google.com/p/elmah/

      如果你使用IIS来托管,你也可以在那里自定义404错误页面。

      【讨论】:

        【解决方案3】:

        我不会在控制器中放置 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
        {
           //...
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-14
          • 1970-01-01
          • 1970-01-01
          • 2012-11-12
          • 1970-01-01
          • 1970-01-01
          • 2011-08-08
          • 2012-05-19
          相关资源
          最近更新 更多