Получить имя формы, имя метода и дополнительные сведения, вызвавшие исключение

Я пытаюсь поймать необработанные исключения, используя следующий код в файле Program.cs.

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

У меня вопрос: есть ли способ получить следующие данные из объекта ошибки после компиляции и обфускации?

  • Название формы, из которой произошла ошибка

  • Номер строки кода, вызвавшего ошибку

  • и любую другую полезную информацию, чтобы точно определить строку кода

    private static void OnUnhandledException(Object sender, UnhandledExceptionEventArgs e)
        {        
       string error;
    
              error = e.Exception.Message + "|" + e.Exception.TargetSite;
          }
    
            private static void OnGuiUnhandedException(object sender, System.Threading.ThreadExceptionEventArgs e)
            {
    
    
       string error;
    
              error = e.Exception.Message + "|" + e.Exception.TargetSite;
    
            } 
    

person techno    schedule 30.12.2013    source источник
comment
Пока вам нужно, чтобы этот код работал хорошо, вам не нужно обфускация. Никто не заинтересован в декомпиляции ошибочного кода, кроме как в том, чтобы диагностировать ошибку за вас. Что гораздо более распространено, чем предполагают программисты. Так что просто отключите обфускацию для простого обходного пути :) Обратитесь за поддержкой к поставщику обфускатора, у всех у них есть какой-нибудь способ вернуть пригодные для использования трассировки стека.   -  person Hans Passant    schedule 30.12.2013
comment
@HansPassant Да, вам нужно отказаться от ощущения закрытого кода для лучшей обработки ошибок. Они предлагают метод, но он делает уязвимый код более уязвимым.   -  person techno    schedule 30.12.2013


Ответы (3)


Я написал следующий фрагмент и использую его для всех своих приложений. Он проходит через все внутренние исключения и трассировки стека тех исключений, которые содержат большую часть необходимой вам информации:

public static string ExceptionTree(Exception ex)
{
    // find all inner exceptions
    StringBuilder strbException = new StringBuilder();
    do
    {
        strbException.AppendLine("Exception: " + ex.Message);
        strbException.AppendLine("Stack Trace: " + ex.StackTrace);
        strbException.AppendLine();

        ex = ex.InnerException;
    }
    while (ex != null);

    return strbException.ToString();
}
person Ted    schedule 30.12.2013
comment
UnhandledExceptionEventArgs не имеет трассировки стека - person techno; 30.12.2013

Просто используйте> System.Environment.StackTrace

try
{
    //Exception

    throw new Exception("An error has happened");
}
catch (Exception ex)
{
     //Open the trace
     System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
     //Write out the error information, you could also do this with a string.Format 
     as I will post lower
     Console.WriteLine(trace.GetFrame(0).GetMethod().ReflectedType.FullName);
     Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
     Console.WriteLine("Column: " + trace.GetFrame(0).GetFileColumnNumber());
}

Использование string.Format

String.Format("An error has occurred at {0} at line {1}", trace.GetFrame(0).GetMethod().ReflectedType.FullName,  trace.GetFrame(0).GetFileLineNumber());
person Philip Gullick    schedule 30.12.2013
comment
UnhandledExceptionEventArgs не имеет Stacktrace, будет ли это работать? - person techno; 30.12.2013
comment
@techno stackoverflow.com/questions/10202987/ - person Philip Gullick; 30.12.2013
comment
Спасибо, но после запутывания все получают некоторые случайные символы. Но он возвращает правильные данные, когда не используется трассировка стека, то есть: только объект исключения. Есть ли способ получить больше данных от него? - person techno; 30.12.2013

Просто,

(e.ExceptionObject as Exception).ToString();

решить свою цель.

person Ankush Madankar    schedule 30.12.2013