Uniwersalne łapanie wyjątków

0

Witam.

Chciałbym w swoim programie (C#) zastosować jakiś mechanizm, który pozwoli mi w prosty sposób wyłapywać wyjątki z dowolnego miejsca w aplikacji.

Program składa się z paru klas - głównie okien. Wszystkie okna są inicjalizowane za pomocą MainForm pośrednio lub nie. Inicjalizacja programu wygląda w skrócie tak:

static void Main(string[] args)
{
     try
     {
           Application.EnableVisualStyles();
           Application.SetCompatibleTextRenderingDefault(false);
           Application.Run(new MainForm());
     }
     catch(Exception e)
     {
          /*tutaj jakiś komunikat o błędzie - cokolwiek, byleby program brutalnie się nie wykrzaczał z niezrozumiałym komunikatem*/
     }
}

Pokazane wyżej rozwiązanie oczywiście nie działa, ponieważ wyłapuje wyjątki tylko wtedy, kiedy "przechodzą" one przez konstruktor MainForm (czyli nie działa np. kiedy kliknę w źle oprogramowany button w innej formie). Czy ma ktoś jakiś pomysł? Zależy mi na tym, aby uniknąć wstawiania try...catch do każdej metody (bo w samej MainForm mam ich ok 60, a podobnych klas jest prawie 20).

Dzięki za wszystkie wskazówki i pozdrawiam

0

Zajrzyj tu: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception%28VS.71%29.aspx. Event handler Application.ThreadException jest wywoływany zawsze, gdy mamy nie złapany wyjątek w aplikacji (cały call stack)

0

Dzięki! Świetne rozwiązanie.

0

No nie tak do końca świetne - moim zdaniem w programie powinna być jednak porządna obsługa wyjątków.

Zauważ, że złapanie wyjątku w tym miejscu niewiele ci daje, bo nie możesz go obsłużyć w żaden sposób poza wyświetleniem komunikatu i ewentualnie wpisu do jakiegos debug log. Wyjątki powinny być obsłużone "wcześniej" i porządnie.

Zresztą:

MSDN napisał(a)

Attach your event handlers to the ThreadException event to deal with these exceptions, as these exceptions will leave your application in an unknown state. Where possible, exceptions should be handled by a structured exception handling block.

Jeżeli chcesz łapać wszystkie wyjątki dopiero na tym poziomie i innej obsługi wyjątków nie masz to znak, że powinieneś jednak gruntownie przeprojektować kod swojej aplikacji. To zdarzenie służy do sytuacji BARDZO awaryjnych gdy jakis wyjątek sie "przeslizgnie" (czasem nie do uniknięcia) a nie po to żeby wszystkie wyjątki łapać w ten sposób.

0
othello napisał(a)

Jeżeli chcesz łapać wszystkie wyjątki dopiero na tym poziomie...

Może trochę niefortunnie się wyraziłem. Pisząc "pozwoli mi w prosty sposób wyłapywać wyjątki z dowolnego miejsca w aplikacji" chodziło mi o awaryjne sytuacje.

othello napisał(a)

To zdarzenie służy do sytuacji BARDZO awaryjnych gdy jakis wyjątek sie "przeslizgnie"

Zgadzam się i nie mam zamiaru wykorzystywać tego w inny sposób. Nie jestem jeszcze na takim poziomie, żeby zuchwale stwierdzić, że obsługuję wszystkie możliwe wyjątki w całej aplikacji. Zawsze może coś się zdarzyć, tym bardziej, że program jest w fazie testów i jeszcze nie wszystko jest pięknie zaimplementowane. W takiej sytuacji użytkownik powinien zostać powiadomiony co się stało w "cywilizowany" sposób. Myślę, że ten event powinien być wykorzystany w aplikacji jako "ostatnia linia obrony".

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