2014-02-18 5 views
1

Я пытаюсь войти с исключениями Эльма, обработанных в try...catch блоках.Ошибки журнала, обработанные в try..catch с Elmah

Я добавил глобального фильтра ошибки ручки на Global.axax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new ElmahHandledErrorLoggerFilter()); 
    filters.Add(new HandleErrorAttribute()); 
} 

Это мой ElmahHandledErrorLoggerFilter:

public class ElmahHandledErrorLoggerFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext context) 
    { 
     if (context.ExceptionHandled) 
      ErrorSignal.FromCurrentContext().Raise(context.Exception); 
    } 
} 

Он будет регистрировать только исключение, как и в try{ ... }catch{ throw new Exception(); }. Но это не проблема, проблема в том, что у меня есть метод с try-catch, вызванный из кода, уже находящегося внутри другого try-catch. В этом случае, хотя я положил throw new Exception() внутри улова внутреннего метода, он не регистрирует исключение, он возвращается к улову в первом методе без регистрации Исключения. Например:

public void MainMethod() 
{ 
    try 
    { 
     SecondMethod(); 
    } 
    catch 
    { 
     ....second method jump here..... 
    } 
} 

public void SecondMethod() 
{ 
    try 
    { 
     int a =0; 
     int b =; 
     int result = b/a; 
    } 
    catch 
    { 
     throw new Exception(); 
    } 
} 

Исключение брошенной SecondMethod не будучи протоколируется Elmah. Он возвращается к основному методу catch. Если основной метод catch также имеет код throw new Exception(), он регистрирует исключение. Однако он будет регистрироваться с трассировкой стека, указывающей на MainMethod, а не на SecondMethod.

Что я хотел, чтобы каждый раз, когда он доходил до улова, не пересовывая новое исключение, Элма заверил бы исключение. Это связано с тем, что у меня есть много блоков try-catch в моем приложении, и я хочу регистрировать эти исключения без ручного входа в каждый try-catch. Однако, если вы скажете мне, как я могу зарегистрировать исключение из SecondMethod, все будет в порядке.

ответ

1

Вы используете ASP MVC?

Фильтры выполняются только для необработанных исключений, исходящих из методов контроллера. (Свойство context.ExceptionHandled сообщает вам, был ли он обработан другим фильтром, а не блоком try-catch). Поэтому, если вы проглотите исключения в блоках try-catch внутри своих методов, они не будут обрабатываться фильтрами ошибок.

Вам необходимо решить, когда вы хотите вручную обрабатывать исключения внутри вашего кода, используя блоки try-catch (и в этом случае вручную регистрировать исключения с помощью базового класса контроллера или вспомогательного класса) или разрешить исключение пузырь и обрабатывать ваши фильтры. (Вероятно, вам понадобится смесь из двух, в зависимости от каждого конкретного случая использования)

Когда вы решите заново исключить исключения, взгляните на this SO question. В принципе вы можете повторно выдать исключение с сохранением трассировки стека с:

try 
{ 
    //code 
} 
catch (Exception ex) 
{ 
    //...some error handling code here... 
    //Otherwise why the try-catch at all? 
    throw; 
} 

Вы можете сделать это в вашей выборке MainMethod и за исключением вошедшего бы сохранить трассировки стека.

 Смежные вопросы

  • Нет связанных вопросов^_^