none
Unhandled Exceptions - StackTrace ist null

    Frage

  • Guten Abend

    In meiner Anwendung hänge ich in der App.xaml.cs den EventHandler für "UnhandledExceptions" ein

    UnhandledException += App_UnhandledException;

    Innerhalb diesem setze ich "handled" auf true, damit die App bei nicht abgefangenen Exceptions, nicht abstürzt. Danach würde ich gerne die genaueren Infos der Exception auslesen

    e.Handled = true;
    
    StackTrace stackTrace = new StackTrace(e.Exception, true);
    var exQuery = stackTrace.GetFrames().Select(frame => new { Class = frame.GetMethod().ReflectedType, Method = frame.GetMethod().Name });

    Dies funktioniert auch einwandfrei, wenn ich das innerhalb eines "Catch-Blockes" aufrufe, so sehe ich detailliert, wo und aus welchem Grund der Fehler passiert. Allerdings ist StackTrace innerhalb des "App_UnhandledException - EventHandler immer null. Warum ist das so? Gibt es irgend eine Möglichkeit, wie ich innerhalb dieses EventHandlers mehr Details über die Exception in Erfahrung bringen kann?

    Freundliche Grüsse


    • Bearbeitet andy-dev Donnerstag, 11. Oktober 2018 19:26
    Donnerstag, 11. Oktober 2018 19:25

Antworten

  • Hallo andy-dev,

    Andere Benutzer haben auch bemerkt, dass sie im globalen Ausnahmehandler den Stacktrace der Ausnahme nur einmal lesen konnten. Bei den nachfolgenden Versuchen wäre der Wert null. Dieses Verhalten wird im folgenden Thread behandelt:
    Inspecting unhandled exceptions – You’ve got only one chance
    Wie dort beschrieben, wenn Du einer Variablen die Ausnahme zuweist, bevor sie ausgelöst wird, kannst Du sie überprüfen.

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.


    Freitag, 12. Oktober 2018 12:13
    Moderator
  • Hallo Andy,

    also meine Erfahrung ist das der StackTrace in e.Exception.StackTrace nicht null ist. Dennoch sind die Informationen darin recht wage. Ich persönlich erstelle mir selbst ein Stack/Log im Ram, im falle einer UnhandledException werte ich dann meinen Stack aus.

    Ich habe es auch grade mal mit diesem einfach Beispiel getestet. 

    public sealed partial class MainPage : Page
        {
            string testS = null;
    
            public MainPage()
            {
                this.InitializeComponent();
    
                App.Current.UnhandledException += Current_UnhandledException;
    
                //Löse ex aus
                var la = testS.Length;
            }
    
            private void Current_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                var la = 123;
            }
        }


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    • Als Antwort markiert andy-dev Freitag, 12. Oktober 2018 19:39
    Freitag, 12. Oktober 2018 12:16

Alle Antworten

  • Hallo andy-dev,

    Andere Benutzer haben auch bemerkt, dass sie im globalen Ausnahmehandler den Stacktrace der Ausnahme nur einmal lesen konnten. Bei den nachfolgenden Versuchen wäre der Wert null. Dieses Verhalten wird im folgenden Thread behandelt:
    Inspecting unhandled exceptions – You’ve got only one chance
    Wie dort beschrieben, wenn Du einer Variablen die Ausnahme zuweist, bevor sie ausgelöst wird, kannst Du sie überprüfen.

    Gruß,

    Ivan Dragov


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.


    Freitag, 12. Oktober 2018 12:13
    Moderator
  • Hallo Andy,

    also meine Erfahrung ist das der StackTrace in e.Exception.StackTrace nicht null ist. Dennoch sind die Informationen darin recht wage. Ich persönlich erstelle mir selbst ein Stack/Log im Ram, im falle einer UnhandledException werte ich dann meinen Stack aus.

    Ich habe es auch grade mal mit diesem einfach Beispiel getestet. 

    public sealed partial class MainPage : Page
        {
            string testS = null;
    
            public MainPage()
            {
                this.InitializeComponent();
    
                App.Current.UnhandledException += Current_UnhandledException;
    
                //Löse ex aus
                var la = testS.Length;
            }
    
            private void Current_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                var la = 123;
            }
        }


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    • Als Antwort markiert andy-dev Freitag, 12. Oktober 2018 19:39
    Freitag, 12. Oktober 2018 12:16
  • Vielen Dank euch beiden. Da es sich hierbei um ein IoT Projekt handelt, geht es mir hauptsächlich darum, dass mein Logger den ungefähren Standort der Exception repräsentieren kann, damit ich auch ungefähr weiss, wo im Code ich suchen muss. Natürlich versuche ich bestmöglich überall auf eventuelle Exceptions zu reagieren, bzw. diese auch abzufangen. Allerdings will ich sichergehen, dass ich bei auftretenden Fehlern den Code direkt korrigieren kann, dabei soll der Handler und der Logger helfen.

    Was ich gerade bemerkt habe ist, dass mit im UnhandledException-EventHandler die ungefähre Position / Klasse / Methode im Parameter e.Message angezeigt wird. Bisher habe ich jeweils nur in e.Exception.Message geschaut, da wird aber nur der Grund der Exception gennant. Ich denke, mit e.Message kann ich mich zufrieden geben. Natürlich ist das Verhalten beim Auslesen des StackTrace trotzdem eher fragwürdig, meiner Meinung nach.

    Freundliche Grüsse

    Freitag, 12. Oktober 2018 19:39
  • Noch ein kurzer Nachtrag, für diejenigen, die auf diesen Thread stossen und das selbe Problem haben. Sobald die Exception im EventHandler (e.Exception) einmal ausgelesen, bzw. Darauf zugegriffen wurde, ist wie weiter oben bereits beschrieben, kein StackTrace mehr verfügbar. Eine simple Lösung dafür ist es, die Exception zu duplizieren, bzw. Diese direkt in ein Exception-Objekt auszulesen. Ich mache das direkt in der ersten Zeile des UnhandledException-EventHandlers

    Exception ex = e.Exception;

    Ab hier ist der StackTrace in e.Exception nicht mehr verfügbar. Allerdings kann dann bequem alles notwendige aus dem eigenen Exception-Objekt "ex" ausgelesen werden.

    Freundliche Grüsse

    Montag, 15. Oktober 2018 19:06