Как включить фактическое имя класса формы в журнале из FirstChanceException? - PullRequest
0 голосов
/ 13 декабря 2018

Моя ситуация такова:

  • У меня есть форма FormBase
  • От этого FormBaseList и FormBaseDetail наследуются

Теперь в моей основной форме я хочу записать в журнал некоторые исключения из события FirstChanceException.Я регистрирую Exception.Message и полное stacktrace

Но в stacktrace у меня есть проблема.
Например, я создаю форму FormCustomerDetail и ее производную от FormBaseDetail.
И возникает исключение в защищенном или закрытом методе, определенном в FormBaseDetail, тогда трассировка стека покажет FormBaseDetail вместо FormCustomerDetail
Это проблема для меня, потому что теперь я не могу знать, что на самом делеисключение произошло.Из FormBaseDetail

получено около 50 форм. Таким образом, вопрос в том, существует ли в событии FirstChanceException способ получения имени класса реальной формы?Или Имя?

AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;

private void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
{
    StackTrace stackTraceObject = new StackTrace();
    string stackTrace = stackTraceObject.ToString();

    // I need to retrieve the actual form name or classname here...
    LogError(
      //ActualFormName + Environment.NewLine +  
      e.Exception.GetType().FullName + Environment.NewLine +  
      e.Exception.Message + Environment.NewLine + 
      stackTrace);
}

Пример логентри:

System.FormatException
Cannot convert xx to type boolean...
...
at Test_app.FormBaseDetail.OpenTables()  
at Test_app.FormBaseDetail.PrepareFormLoad()
...

Что бы я хотел получить

Exeption occured in FormCustomerDetail
System.FormatException
Cannot convert xx to type boolean...
...
at Test_app.FormBaseDetail.OpenTables()  
at Test_app.FormBaseDetail.PrepareFormLoad()
...

1 Ответ

0 голосов
/ 13 декабря 2018

Наивным способом было бы фактически зарегистрировать его внутри базовой формы - то есть иметь что-то вроде:

class FormBaseDetail 
{
   private void Guard(Action a)
   {
       try { a.Invoke(); }
       catch(Exception e)
       {
          throw new Exception("Exception on '" + this.GetType() + "'", e);
       }
   }

   // pretty much everywhere in base class
   public void PrepareFormLoad() 
   {
      Guard(() => { ... });
   }
}

Кроме того, я могу представить себе зацепление FormLoad и помещение активного типа формы в некоторую статическую переменную.например.

...