2014-10-01 5 views
3

У меня есть специальное исключение, где я перекрываться на Data свойства, используя отражение, как в следующем ...Как зарегистрировать настраиваемое исключение с дополнительным свойством Data в Elmah?

public class MyCustomException : Exception 
{ 
    private readonly SomeModel _log; 
    public MyCustomException(SomeModel log) 
     : base(string.Format("Could not insert to some table")) 
    { 
     _log = log; 
    } 

    public override System.Collections.IDictionary Data 
    { 
     get 
     { 
      var data = new Dictionary<string, object>(); 
      foreach (PropertyInfo pinfo in _log.GetType().GetProperties()) 
      { 
       data.Add(pinfo.Name, pinfo.GetType().GetProperty(pinfo.Name)); 
      } 
      return data; 
     } 
    } 
} 

Когда выше исключение, он получает писаться Elmah но Data не вошли.

Какие изменения я должен сделать, чтобы Data также был зарегистрирован в elmah? Пожалуйста посоветуй.

ответ

1

Detail свойство Elmah.Error объекта - который затем обрабатывается с помощью ErrorLog класса - построен из ToString() метода исключения.

// Elmah.Error 
public Error(Exception e, HttpContext context) 
{ 
    // snip 
    this._detail = e.ToString(); // here 
    // snip 

Добавить данные в переопределение метода ToString в MyCustomException, чтобы увидеть его в Elmah.

+0

Если вы хотите иметь пользовательский процесс для этих данных, вам нужно будет создать собственный класс 'ErrorLog' – samy

1

@samy может быть более правильным, но я также нашел другой возможный вариант, который работает для моей ситуации. Я использую elmah в проекте webapi2, где пользователи анонимны и в одном конкретном контроллере я хочу записать некоторый контекст запроса из модели просмотра (в моем случае, адрес электронной почты, но я мог бы записать больше данных), и я хочу быть способный связывать ошибки с электронной почтой, поэтому я могу определить после ошибки, если тот же пользователь смог отправить заказ успешно.

В моем контроллере я выполняю несколько вызовов базы данных в транзакции, а затем отправляю заказ на paypal, все в блоке try/catch. В catch я создаю новый экземпляр исключения с сообщением, содержащим электронное письмо, и установлю свойство innerException на созданное исключение и генерирую новое исключение.

Я знаю, что можно потерять информацию о трассировке стека, я проверил это в своем контексте, и трассировка стека, по-видимому, поддерживается, но исключения происходят внутри контроллера, потому что этого конкретного контроллера и приложения не так много слоев. Если кто-то имеет подобную ситуацию, этот метод может быть самым быстрым и простым.

catch (Exception ex) 
{ 
    Exception newException = new Exception(viewModel.ContactEmail, ex); 
    throw newException; 
} 

Это предполагает, что вы есть фильтр исключений, например, как показано ниже (для WebAPI), и фильтр зарегистрирован как глобальный global.asax.

public class LogExceptionAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     if (HttpContext.Current != null) 
     { 
      ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception); 
     } 
    } 
} 

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

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