Przechwytywanie wyjątku kiedy aplikacja nieoczekiwanie zakończy działanie

0

Witam wszystkich.

Mam problem z przechwytywaniem wyjątku. Normalne przechwytywanie działa poprawnie, ale problem pojawia się gdy "aplikacja przestanie działać". Potrzebuję zrzucić do logów wyjątek, kiedy apka się wywali. Wtedy jak wiadomo sam program już nie działa, pytanie więc jak mogę to przechwycić tuż przed wywaleniem aplikacji ?

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); - Nie działa

DispatcherUnhandledException="Application_DispatcherUnhandledException" w app.xaml - Nie działa

2

ten kod

AppDomain currentDomain = AppDomain.CurrentDomain;
            currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); - Nie działa
 

powinno dzialac. Czy to sie wywala na innym watku? Moze podaj wiecej szczegolow. To wtedy Ci pomoge (ostatnio robilem crash loga takze robilem dosc duzy research na ten temat). Musze wiedziec o jakie warunki crasha mowimy. Dales breakpoint w swojej funkcji ktora przekazujesz do event handlera? Jestes 100% pewien ze nie jest wywolywana? czego uzywasz do logowania?

Czy chodzi Ci po prostu o zlapanie wyjatku?

0

Niestety nie przechwytuje mi wyjątku. Chodzi mi tylko i włącznie o samo przechwycenie i zapis do loga. Mam jedną operację, która na mojej maszynie działa bez problemu a po odpaleniu na innej wywala błąd. Muszę więc wiedzieć która linia kodu w której metodzie się kaszani, bez odpalania debuggera i stawiania pułapek.

Do logowania mam napisaną prostą metodę zapisującą zawartość wyjątku ( bądź dowolną inną wartość ) do pliku txt

0

A ten wyjątek nie leci przypadkiem z kodu niezarządzanego?

0

A jestes pewien, ze event nie jest lapany? Moze jest lapany tylko zapic do pliku z jakiegos powodu sie wywala albo nie wykonuje? Moze sprobuj tego exceptiona wywalic w message boxa albo cos podobnego?

0
azi napisał(a):

Mam jedną operację, która na mojej maszynie działa bez problemu a po odpaleniu na innej wywala błąd

Skoro to jedna operacja, to i jedna metoda ją startuje, umieść ją w try/catch, zaloguj złapany wyjątek i po kłopocie. Nie musisz łapać wszystkich wyjątków na świecie. Gorzej, jeśli działasz asynchronicznie, ale od czego google:
http://stackoverflow.com/questions/793100/globally-catch-exceptions-in-a-wpf-application
http://stackoverflow.com/questions/1472498/wpf-global-exception-handler
http://www.abhisheksur.com/2010/07/unhandled-exception-handler-for-wpf.html
...

Inna sprawa, że dobrze napisana aplikacja powinna mieć zrobiona łapanie i logowanie błędów trochę bardziej szczegółowe, niż globalny handler.

0

Jak bym wiedział która metoda wywala błąd to bym się nie bawił w takie cyrki ... Przez "jedną metodę" miałem na myśli to, że przy konkretnej operacji wywala błąd - czyli że ogólnie apka działa poprawnie. Chyba faktycznie będę musiał bardziej rozbudować logera na poziomie konkretnych klas bo globalnie to nie działa. W tej chwili wszystkie try-catche mają podpiętego loggera, ale widocznie to nie wystarczy. Globalnie to nie działa, albo inaczej , działa, ale raz na x-naście przypadków ...

0

Zobacz w zdarzeniach windows. Tam znajdziesz nieobsłużone wyjątki wraz ze śladem stosu

0

Podepnę się. Myślałem, że coś takiego zadziała, ale nie chce. Czemu?

 
 [STAThread]
        static void Main()
        {     
            try
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new MainForm());
            }catch(Exception e)
            {
                MessageBox.Show("Unhandled exception!\n" + e.Message);
                ErrorLogger.LogError("Unhandled exception", e.Message);
            }
        }

Aplikacja wielowątkowa.

2

Wyjątek leci w dół stosu wywołań kolejnych metod. Skoro to osobny wątek, to jego stos nie zaczyna się w Main(). Na dole stosu wątku jest metoda, która została wywołana w konstruktorze klasy Thread i to tam najpóźniej powinien być łapany wyjątek.
Autor wątku ma pewnie dokładnie z tym samym problem.

[edit]
ErrorLogger.LogError("Unhandled exception", e.Message); - to żeś sobie pologował. Dostaniesz "Sequence contains no elements" i będziesz szukał wiatru w polu. Twój logger powinien przyjmować jako argument całe exception i logować gdzieś stack trace'a.

1 użytkowników online, w tym zalogowanych: 0, gości: 1