Получение объекта Exception в try..catch для включения FULL stacktrace, в настоящее время его усеченного - PullRequest
4 голосов
/ 23 мая 2011

кто-нибудь может помочь?

Я пытаюсь получить полную трассировку стека, когда поймал try..catch. В настоящее время его усекают, чтобы включить только текущий метод, где ошибка ....

Позвольте мне объяснить. В настоящее время моя трассировка стека включает метод «Третий», в котором возникает ошибка, но первый и второй не включены, я считаю, что это сделано специально.

private void First()
{
    this.Second();
}

private void Second()
{
    this.Third();
}

private void Third()
{
    try
    {
        throw new SystemException("ERROR HERE!");
    }
    catch (Exception ex)
    {
        // I WILL LOG THE EXCEPTION object "EX" here ! but ex.StackTrace is truncated!
    }
}

Я видел несколько уловок, чтобы получить полную трассировку стека в STRING, но проблема в том, что моя среда ведения журналов ожидает объект типа «Исключение», но моя переменная (ex), в которой есть мое исключение, действительна, но свойство StackTrace является усеченный.

Есть ли в любом случае я могу получить полное исключение с полной трассировкой стека, так что я могу все еще отправлять мой "EX", но на этот раз он будет иметь нерезанную трассировку стека.

Событие UnhandledErrror, похоже, работает так, как будто я прибыл сюда. Исключение имеет трассировку стека и полностью заполнено ...

Буду очень признателен за любые отзывы.

Ответы [ 4 ]

3 голосов
/ 23 мая 2011
string fullStackTrace = exception.StackTrace + Environment.StackTrace;

Текущий метод может быть добавлен два раза, если так, удалите одну строку из одного из свойств.

2 голосов
/ 23 мая 2011
class Program
    {
        static void Main(string[] args)
        {
            try
            {
                First();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            Console.ReadLine();
        }

        private static void First()
        {
            Second();

        }

        private static void Second()
        {
            Third();

        }

        private static void Third()
        {
            throw new SystemException("ERROR HERE!");
        }
    }

Вывод в этом случае:

   at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 37
   at stack.Program.Second() in C:\Temp\customers\stack\Program.cs:line 31
   at stack.Program.First() in C:\Temp\customers\stack\Program.cs:line 25
   at stack.Program.Main(String[] args) in C:\Temp\customers\stack\Program.cs:li
ne 14

Обновление: У меня внезапно возникли сомнения, и я пробежал по всем решениям, представленным до сих пор.Все они работают, хотя Environment.StackTrace - самый простой.Вот как выглядит вывод:

==ex.StackTrace==
   at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 35

==Environment.StackTrace per Guillaume/Jorge Córdoba==
   at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 35   at S
ystem.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
   at System.Environment.get_StackTrace()
   at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 44
   at stack.Program.Second() in C:\Temp\customers\stack\Program.cs:line 27
   at stack.Program.First() in C:\Temp\customers\stack\Program.cs:line 21
   at stack.Program.Main(String[] args) in C:\Temp\customers\stack\Program.cs:li
ne 15
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySec
urity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, C
ontextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

==ex.ToString() per danyolgiax==
System.SystemException: ERROR HERE!
   at stack.Program.Third() in C:\Temp\customers\stack\Program.cs:line 35

==GetFrame(i) per MBen==
Void Third(): (line 52)
Void Second(): (line 27)
Void First(): (line 21)
Void Main(System.String[]): (line 15)
Int32 _nExecuteAssembly(System.Reflection.Assembly, System.String[]): (line 0)
Int32 ExecuteAssembly(System.String, System.Security.Policy.Evidence, System.Str
ing[]): (line 0)
Void RunUsersAssembly(): (line 0)
Void ThreadStart_Context(System.Object): (line 0)
Void Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, Sy
stem.Object): (line 0)
Void ThreadStart(): (line 0)
1 голос
/ 23 мая 2011

Вы не понимаете, как работает трассировка стека.То, что включено в трассировку исключений, это «маршрут», означающий, что исключение прошло, чтобы достичь точки, в которой вы его обрабатываете.

Таким образом, в вашем примере оно вообще не перемещалосьтем не менее, это все еще в «третьем» методе.Если бы он всплыл до «Second», то он перешел бы через «Third» во «Second», и вы получите это на трассировке стека.

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

Попробуйте зарегистрировать CallStack, где выобработать исключение.

1 голос
/ 23 мая 2011

Вам нужно что-то вроде этого:

        private static void Third()
        {
        try
        {
            throw new SystemException("ERROR HERE!");
        }
        catch (Exception ex)
        {
            // I WILL LOG THE EXCEPTION object "EX" here ! but ex.StackTrace is truncated!
            StackTrace st = new StackTrace(true);
            for (int i = 0; i < st.FrameCount; i++)
            {
                // Note that high up the call stack, there is only
                // one stack frame.
                StackFrame sf = st.GetFrame(i);
                Console.WriteLine();
                Console.WriteLine("High up the call stack, Method: {0}",
                                  sf.GetMethod());

                Console.WriteLine("High up the call stack, Line Number: {0}",
                                  sf.GetFileLineNumber());
            }
        }
    }

Проверьте эту статью для получения дополнительной информации: Класс StackStace

Надеюсь, это поможет.

...