Как заставить Эльму работать с UnobservedTaskException - PullRequest
2 голосов
/ 06 марта 2012

Я занимаюсь разработкой приложения asp.net mvc. Архитектура моего приложения, как показано ниже:

  1. слой DBAccessLayer // для доступа к базе данных
  2. слой ServiceLayer // для соединения 1 и 3.
  3. слой WebLayer // Web UI

Я хочу регистрировать все исключения приложений, включая исключения в событии TaskScheduler.UnobservedTaskException.

Я проверял, чтобы сделать, как показано ниже:

protected void Application_Start()
{
    ...
    TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs excArgs) =>
    {
      ErrorSignal.FromCurrentContext().Raise(excArgs.Exception);      
      excArgs.SetObserved();
    };
}

но при возникновении события UnobservedTaskException происходит сбой приложения с исключением, как показано ниже:

    System.ArgumentNullException was unhandled
         Message=Value cannot be null.
         Parameter name: context
         Source=Elmah
         ParamName=context
    StackTrace:
         at Elmah.ErrorSignal.FromContext(HttpContext context) in c:\builds\ELMAH\src\Elmah\ErrorSignal.cs:line 67
         at MyMvcApplication.<Application_Start>b__0(Object sender, UnobservedTaskExceptionEventArgs excArgs) in ...\Global.asax.cs:line 82
         at System.Threading.Tasks.TaskScheduler.PublishUnobservedTaskException(Object sender, UnobservedTaskExceptionEventArgs ueea)
         at System.Threading.Tasks.TaskExceptionHolder.Finalize()

Кроме того, я поместил событие UnobservedTaskException в global.asax.cs WebLayer. Может ли оно быть запущено, когда DBAccessLayer и ServiceLayer имеют ненаблюдаемые исключения?

Спасибо.

1 Ответ

0 голосов
/ 12 сентября 2012

Похоже, что когда ваш обработчик запускается, HttpContext не существует, потому что запланированная задача не выполняется как часть HTTP-запроса. Вместо использования

ErrorSignal.FromCurrentContext().Raise

вы можете использовать

ErrorLog.GetDefault(null).Log
...