Ursprünglichen StackTrace bei wiedergeworfenen Exceptions beibehalten

Thomas Darimont

Erfahrenes Mitglied
Hallo,

hier mal ein Beispiel, wie man mit einem kleinen "Trick" den ursprüunglichen StackTrace einer wiedergeworfenen Exception
erhalten kann:


C#:
using System;
using System.Collections.Generic;
using System.Text;

namespace De.Tutorials.Training
{
    public class PresevereExceptionStackTrace
    {
        public static void Main(string[] args)
        {
            Operation1();
        }

        private static void Operation1()
        {
            try
            {
                Operation2();
            }
            catch (Exception exception)
            {
                //... do something
                throw exception;
            }
        }

        private static void Operation2()
        {
            throw new Exception("The method or operation is not implemented.");
        }
    }
}


Ausgabe:
Code:
Unbehandelte Ausnahme: System.Exception: The method or operation is not implemented.
   bei De.Tutorials.Training.PresevereExceptionStackTrace.Operation1() in C:\Dokumente und Einstellungen\Tom\Eigene Dateien\Visual Studio 2005\Projects\De.Tutorials.Training\De.Tutorials.Training\PresevereExceptionStackTrace.cs:Zeile 23.
   bei De.Tutorials.Training.PresevereExceptionStackTrace.Main(String[] args) in C:\Dokumente und Einstellungen\Tom\Eigene Dateien\Visual Studio 2005\Projects\De.Tutorials.Training\De.Tutorials.Training\PresevereExceptionStackTrace.cs:Zeile 10
Drücken Sie eine beliebige Taste . . .

Hier sieht man das der StackTrace in der Methode Operation1() beginnt, obwohl die eigentliche Exception in Operation2 ausgelöst wurde...

Ändert man jedoch den Body der Methode Operation1 so um:
C#:
        private static void Operation1()
        {
            try
            {
                Operation2();
            }
            catch (Exception exception)
            {
                //... do something
                throw;
            }
        }

Schaut unser StackTrace folgendermaßen aus:
Code:
Unbehandelte Ausnahme: System.Exception: The method or operation is not implemented.
   bei De.Tutorials.Training.PresevereExceptionStackTrace.Operation2() in C:\Dokumente und Einstellungen\Tom\Eigene Dateien\Visual Studio 2005\Projects\De.Tutorials.Training\De.Tutorials.Training\PresevereExceptionStackTrace.cs:Zeile 29.
   bei De.Tutorials.Training.PresevereExceptionStackTrace.Operation1() in C:\Dokumente und Einstellungen\Tom\Eigene Dateien\Visual Studio 2005\Projects\De.Tutorials.Training\De.Tutorials.Training\PresevereExceptionStackTrace.cs:Zeile 20.
   bei De.Tutorials.Training.PresevereExceptionStackTrace.Main(String[] args) in C:\Dokumente und Einstellungen\Tom\Eigene Dateien\Visual Studio 2005\Projects\De.Tutorials.Training\De.Tutorials.Training\PresevereExceptionStackTrace.cs:Zeile 10.
Drücken Sie eine beliebige Taste . . .

Wie man sieht ist nun Operation2() der Anfang des StackTrace, d.h. die ursprüngliche Stelle an der die Exception aufgetreten ist.
Wirft man eine gefangene Exception erneut mit throw ohne die exception Instanz tatsächlich "anzufassen" (beispielswiese mit throw ex), so beleibt der ursprüngliche StackTrace erhalten! Das macht das Debugging schon sehr viel einfacher :)

Gruß Tom
 
Zurück