Вземете име на формуляр, име на метод и повече подробности, които са причинили изключението

Опитвам се да уловя необработени изключения, като използвам следния код във файла 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 няма Stacktrace - 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