6 Stimmen

.NET "Fehlerbericht an [mich] senden"

Wenn sich eine Ausnahme den ganzen Weg bis zum Anfang meiner Anwendung ausbreitet (was natürlich nie passieren wird), würde ich gerne die Möglichkeit bieten, einen Fehlerbericht an mich zu senden, bevor das Programm abstürzt. Was mir vorschwebt, ist, alles in der Main-Funktion in ein try-catch zu verpacken, und eine kleine Klasse, die den Stack-Trace und andere Informationen an meinen Server sendet. Das hört sich einfach an, aber bei so etwas gibt es sicher Hürden (z.B. Sicherheit, Zukunftssicherheit), die ich noch nicht ganz bedacht habe.

Gibt es eine bestehende .NET-Bibliothek/ein Projekt für diesen Zweck? Oder klingt das alternativ nach dem richtigen Ansatz, einfach alle Ausnahmen im Einstiegspunkt der Anwendung abzufangen?

3voto

Treb Punkte 19459

参照 diese Frage bei allen verfügbaren Logging-Frameworks in .NET sollte jeder von ihnen eine E-Mail-Benachrichtigung anbieten.

Ich halte es für eine bewährte Praxis, einen Top-Level-Exception-Handler zu haben, der Daten über nicht abgefangene Ausnahmen sammelt und protokolliert. Wie Meeh in seinem Kommentar zu Ihrer Frage erwähnt, benötigen Sie einen für jeden Thread in Ihrer Anwendung.

Es gibt eine alter Artikel von Joel über die Fehlerberichtsfunktion in FogBugz, vielleicht gibt Ihnen das einige weitere Ideen. (Ich glaube, ich habe es in seinem Blog gelesen, aber alles, was ich finden konnte, ist diese Seite aus der FogBugz-Dokumentation).

1voto

JP Alioto Punkte 44283

Sie können die Protokollierung Anwendungsblock von Unternehmensbibliothek um auf einfache Weise E-Mails zu versenden, wenn Sie Ausnahmen feststellen und protokollieren. Hier sind einige Informationen, wie man einen Last Chance Exception Handler erstellen . Ich habe angenommen, dass Sie eine Winform-Anwendung haben, aber das geht aus Ihrer Frage nicht hervor.

1voto

Curt Nichols Punkte 2747

Verwenden Sie die gleichen Werkzeuge wie in Windows: Windows-Fehlerberichterstattung (WER). Es führt eine Crash-Analyse durch und ordnet Ihre Crashs in Kategorien ein, so dass Sie verstehen können, welche die häufigsten sind. Es sind keine Code-Änderungen erforderlich, da es auf Prozessebene arbeitet. Es protokolliert die Ausfälle von Ausnahmen, die Sie nicht abfangen können.

Natürlich unter der Voraussetzung, dass Sie mit Windows arbeiten.

1voto

Joe Kuemerle Punkte 6278

Mein Standard-Haftungsausschluss: Ich bin ein Entwickler für dieses Produkt.

Mit einem Produkt (Runtime Intelligence), das von dem Unternehmen entwickelt wurde, für das ich arbeite (PreEmptive Soltutions), können Sie nicht nur Fehlerberichte einfügen, sondern auch die Möglichkeit, zu verfolgen, wann Benutzer Ihre Anwendungen verwenden und welche Funktionen sie nutzen, und das mit minimalem Programmieraufwand.

Mithilfe von Dotfuscator zur Code-Injektion (oder IL Weaving) fügen wir neuen Code in Ihre Anwendungs-Binärdateien ein, der Nutzungsdaten an einen bei uns gehosteten Server (oder optional an eine beliebige URL) zurücksendet. Wenn Sie die Daten an uns senden, stellen wir Ihnen eine Reihe leistungsfähiger Analysetools und Berichte über die Nutzung zur Verfügung.

Eine Basisversion dieser Funktionalität soll in Visual Studio 2010 enthalten sein, ebenso wie der Zugang zu einem kostenlosen Portal für die Datenberichterstattung (allerdings ohne SLAs, Datenaufbewahrungsgarantien oder Datenschutz).

Die Möglichkeit, beliebige Daten zusammen mit den Nutzungsinformationen zurückzusenden, ist auf das kommerzielle Produkt beschränkt, aber Sie können PreEmptive Soltutions kontaktieren, um eine voll funktionsfähige, zeitlich begrenzte Testversion zu erhalten.

Sie können die Fehlerberichterstattung mit dem unten stehenden Beispielcode durchführen:

public partial class app : Application {
// field to temporarily store exception data        
    private Exception exp;
    void AppStartup(object sender, StartupEventArgs args) {
        // add a handler to catch any unhandled exceptions    
        this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(ErrorHandler); 
        Window1 mainWindow = new Window1();
        mainWindow.ShowDialog();
    }

    // this will prompt the user if they want to report the exception
    void ErrorHandler(object sender, DispatcherUnhandledExceptionEventArgs e) {
        this.exp = e.Exception;
        if (MessageBox.Show("A " + exp.Message + " exception happened, should I report it?", "Error Occurrend", MessageBoxButton.YesNo) == MessageBoxResult.Yes) {
            ErrorHappened();
            e.Handled = true;
        }
    }

    // this method is called by the above ErrorHandler method and when run through Dotfuscator additional code will be injected into this method that will send a usage data message back to the server and the data in the dictionary (which will be exception data) returned by the ErrorData method will be included into the message and be stored and reported on the server
    [Feature("Exception", EventType = FeatureEventTypes.Tick, ExtendedKeySourceElement = SourceElements.Method, ExtendedKeySourceName = "ErrorData")]
    private void ErrorHappened() {
        // This is here as a placeholder for the exception feature attribute which will exit the application when executed
        AppShutdown(true);
    }

    // this method takes the exception data from the exp field and returns it as a dictionary of name/value pairs
    public Dictionary<string, string> ErrorData() {
        var retval = new Dictionary<string,string>();
        if (null != exp) {
            retval.Add("Error Message",exp.Message);
            retval.Add("Stack Trace",exp.StackTrace);
        }
        return retval;
    }
}

1voto

Blake Niemyjski Punkte 3272

Ich arbeite an dem Open-Source-Projekt Exceptionless, das über Client-Bibliotheken verfügt, die genau das tun! Wir erfassen alle unbehandelten Ausnahmen und senden sie an eine Rest-Api und verarbeiten sie dann in Echtzeit.

https://github.com/exceptionless/Exceptionless

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X