当前位置: 首页 > 知识库问答 >
问题:

如何全局记录C#MVC4 WebAPI应用程序的所有异常?

卜鹏
2023-03-14
protected void Application_Error()
{
     Exception unhandledException = Server.GetLastError();
     //do more stuff
}
public class ReportController : ApiController
{
    public int test()
    {
        var foo = Convert.ToInt32("a");//Will throw error but isn't logged!!
        return foo;
    }
}

我还尝试通过注册这个筛选器来全局设置[HandleError]属性:

filters.Add(new HandleErrorAttribute());

但这也不会记录所有错误。

如何截获像上面通过调用/test生成的错误,以便记录它们?看来这个答案应该是显而易见的,但我已经尝试了迄今为止我能想到的一切。

public class ExceptionHandlingAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is BusinessException)
        {
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent(context.Exception.Message),
                ReasonPhrase = "Exception"
            });

        }

        //Log Critical errors
        Debug.WriteLine(context.Exception);

        throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent("An error occurred, please try again or contact the administrator."),
            ReasonPhrase = "Critical Exception"
        });
    }
}
public static class WebApiConfig
{
     public static void Register(HttpConfiguration config)
     {
         config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });
         config.Filters.Add(new ExceptionHandlingAttribute());
     }
}

或者,您可以跳过注册,只使用[ExceptionHandling]属性装饰单个控制器。

共有1个答案

漆雕兴平
2023-03-14

作为对先前答案的补充。

昨天,ASP.NET Web API 2.1正式发布。
它提供了另一个全局处理异常的机会。
示例中给出了详细信息。

简单地说,您可以添加全局异常记录器和/或全局异常处理程序(只有一个)。
您可以将它们添加到配置中:

public static void Register(HttpConfiguration config)
{
  config.MapHttpAttributeRoutes();

  // There can be multiple exception loggers.
  // (By default, no exception loggers are registered.)
  config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());

  // There must be exactly one exception handler.
  // (There is a default one that may be replaced.)
  config.Services.Replace(typeof(IExceptionHandler), new GenericTextExceptionHandler());
}
public class ElmahExceptionLogger : ExceptionLogger
{
  public override void Log(ExceptionLoggerContext context)
  {
    ...
  }
}

public class GenericTextExceptionHandler : ExceptionHandler
{
  public override void Handle(ExceptionHandlerContext context)
  {
    context.Result = new InternalServerErrorTextPlainResult(
      "An unhandled exception occurred; check the log for more information.",
      Encoding.UTF8,
      context.Request);
  }
}
 类似资料:
  • 问题内容: 我有一个可怕的Java应用程序(鲜为人知的应用程序服务器GNUEnterprise的客户端)及其源代码,在对其进行了一些更改之后,我可以将其编译回去。该应用程序占用大量网络资源,我需要监视每个请求和响应。我可以使用像Wireshark这样的嗅探器,但是该应用程序可以通过SSL与它的服务器一起工作,因此不知道SSL证书的私钥是否会导致嗅探到的流量毫无用处。 我该怎么做才能使每个请求和响应

  • 问题内容: 我问一个有关如何覆盖默认的Java异常处理问题,被告知的答案在这里。 现在的问题是:是否有一种方法可以将该处理程序泛化为所有线程,而无需在每个线程中明确声明? 我认为应该可以某种方式获取所有线程,然后将其绑定到异常处理程序? 问题答案: 使用。正如javadoc所说: “通过设置默认的未捕获异常处理程序,应用程序可以更改那些已经接受系统提供的任何“默认”行为的线程的未捕获异常处理方式(

  • 因此,我试图以通用的方式记录spring项目的控制器返回的所有未捕获的异常。我可以使用以下异常处理程序来完成此操作: 但是,对于方法的每次调用,由于方法中抛出的异常,会创建第二个错误日志:代码来自org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolveHandlerMethodExc

  • 问题内容: 我想在Java应用程序中定义一个应用程序级别 UncaughtExceptionHandler ,如果在应用程序的一个线程中引发了未捕获的异常,则会调用该应用程序级别。我知道有可能为一组线程(ThreadGroup)定义一个未捕获的异常,而我实际上正在使用它,但是我想为 尚未定义自己的未捕获的异常处理程序的线程定义一个全局未捕获的异常。未与定义了默认异常处理程序的一组线程关联 。 因此

  • 我希望我的ExceptionMapper捕获所有异常并记录它们。。。我现在正在使用Jersey 2.0。 我有一个异常映射器,如下所示: 此异常映射器仅在非WebApplication应用程序异常时被调用。 如何使一个全局异常映射器捕获所有异常,以便记录它们。我还有别的办法吗? 谢谢

  • 我正在使用Java、Tomcat和泽西创建一个REST Web应用程序。我正在使用注释(没有web.xml!)我最终使用了这个应用程序配置: 这是我的问题。Web容器有一个全局应用程序对象。我正在将其从应用程序构造函数保存到静态字段中。稍后我需要从其他类访问它(它包含全局配置、全局数据库连接工厂,可能还有其他东西。) 我这样做对吗?我怀疑一定有更好的方法:在处理注释时保存对应用程序的引用。但我不知