2009-07-25 10 views
6

Jeśli wyjątek rozprzestrzenia się aż do początku mojej aplikacji (co, oczywiście, nigdy się nie wydarzy), chciałbym zaproponować opcję wysłania błędu zgłoś mi się, zanim program się zawiesza. Mam na myśli zawijanie wszystkiego w funkcji głównej w try-catch i małą klasę, która wysyła ślad stosu i inne informacje do mojego serwera. Brzmi to dość prosto, ale z czymś takim jestem pewien, że istnieją przeszkody (takie jak bezpieczeństwo, zabezpieczenie na przyszłość), których nie rozważałem w pełni..NET "Wyślij raport błędu do [mnie]"

Czy istnieje w tym celu biblioteka/projekt .NET? Lub alternatywnie, czy to brzmi jak właściwe podejście, po prostu wychwycenia wszystkich wyjątków w punkcie wejścia aplikacji?

+0

Można by nadal mieć problem połowu wyjątki generowane przez innych wątków :) – cwap

+0

A także istnieją nieuchwytny excpetions; np. StackOverflowException;) – Wilhelm

+0

"Jeśli wyjątek rozprzestrzenia się aż do początku mojej aplikacji (co, oczywiście, nigdy się nie wydarzy) ..." Zapomniałeś dodać buźkę, aby dać nam znać, że żartujesz. :) Nie jest przesadą stwierdzenie, że wszystkie aplikacje ulegają awarii. –

Odpowiedz

4

Zapoznaj się z this question na temat wszystkich dostępnych struktur logowania w .NET, każdy z nich powinien oferować powiadomienia e-mail.

Uważam, że najlepszą praktyką jest posiadanie programu obsługi wyjątku najwyższego poziomu, który zbiera i rejestruje dane o niezatrzonych wyjątkach. Jak wspomina Meeh w swoim komentarzu do twojego pytania, potrzebujesz jednego dla każdego wątku w twojej aplikacji.

Istnieje old article from Joel w funkcji zgłaszania błędów w FogBugz, może to da ci więcej pomysłów. (Myślę, że czytałem to na jego blogu, ale wszystko, co mogłem znaleźć, to strona z dokumentacji FogBugz).

+0

Ten link nie jest już aktualny. Pracuję nad następującym projektem open source, który wykonuje niesamowitą robotę przy zbieraniu i raportowaniu wyjątków (https://github.com/exceptionless/Exceptionless). –

1

Użyj tych samych narzędzi, których używa system Windows: Windows Error Reporting (WER). Wykona analizę awarii i zbuforuje twoje awarie, abyś mógł zrozumieć, które są najczęstsze. Nie wymaga żadnych zmian kodu, działa na poziomie procesu. Będzie rejestrować awarie z wyjątków, których nie można przechwycić.

Zakładając, że używasz systemu Windows, oczywiście.

+0

Czy WER prześle raporty o błędach do PO? –

+1

Nie jestem pewien, co oznacza OP. WER wysyła raporty o błędach do Microsoft, gdzie są przechowywane. Programista może okresowo pobierać je do analizy. Jedynym wymaganiem jest to, że programista rejestruje się w Microsoft i dostarcza podpis cyfrowy, aby zidentyfikować swój kod kosztem kilkuset dolarów. Więcej tutaj: http://pl.wikipedia.org/wiki/Windows_Error_Reporting – urig

+0

Oryginalny plakat. –

1

Moje standardowe wyłączenie odpowiedzialności: Jestem programistą tego produktu.

Korzystając z produktu (Runtime Intelligence) napisanego przez firmę, w której pracuję (PreEmptive Soltutions), można wstrzykiwać nie tylko raportowanie błędów, ale także śledzić, kiedy użytkownicy korzystają z aplikacji i jakie funkcje wykorzystują przy minimalnym kodowaniu .

Za pomocą aplikacji Dotfuscator do wykonywania wstrzyknięć kodu (lub tkania IL) wstawiamy nowy kod do plików binarnych aplikacji, które wysyłają dane użytkowania z powrotem do serwera hostowanego w naszym obiekcie (lub opcjonalnie do dowolnego dowolnego dowolnego adresu URL). Jeśli prześlesz nam dane, udostępnimy Ci szereg zaawansowanych narzędzi analitycznych i raportów dotyczących użytkowania.

Podstawowa wersja tej funkcji ma być zawarta w Visual Studio 2010, jak również dostęp do bezpłatnego portalu raportowania danych (ale bez umów SLA, gwarancji zatrzymywania danych lub prywatności danych).

Możliwość wysyłania dowolnych danych z powrotem wraz z informacjami o użytkowaniu jest ograniczona do produktu komercyjnego, ale możesz skontaktować się z PreEmptive Soltutions, aby uzyskać w pełni funkcjonalną, czasową wersję próbną.

można osiągnąć raportowanie błędów z przykładowy kod poniżej:

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; 
    } 
} 
1

I zmodyfikowane Jeff User-Friendly Exception Handler i aktualizowane go do .NET 2.0/3.5, i miałem z tym dużo szczęścia. Jeśli wyjątek powoduje, że cały stos nie jest obsługiwany, zrzut ekranu jest przesyłany pocztą e-mail wraz ze szczegółowym śledzeniem stosu do zespołu programistów.

1

Pracuję nad projektem open source Bez wyjątku, który ma biblioteki klienta, które robią to właśnie! Przechwytujemy wszystkie nieobsługiwane wyjątki i wysyłamy je do api odpoczynku, a następnie przetwarzamy je w czasie rzeczywistym.

https://github.com/exceptionless/Exceptionless