try-catch Redundanz in GUI Events



  • Hallo,

    ich hab ein Problem bzw etwas das mich nervt in meiner Anwendung. Und zwar ist das eine GUI mit ziemlich vielen Controls (Buttons etc.). Jedes Control löst eine bestimmte Aktion aus, in der verschiedenste Fehler auftreten können. Alle Fehler werden mittels Exceptions signalisiert.

    Jetzt können die Fehler zwar sehr unterschiedlich sein, die Behandlung dieser ist aber immer gleich: Einfach eine Fehlermeldung ausgeben. Also mache ich das so:

    void Button1ClickedImpl(object sender, EventArgs e)
    {
        // Mach was
    }
    
    void button1_Click(object sender, EventArgs e)
    {
        try { Button1ClickedImpl(sender, e); }
        catch (Exception ex) { MessageBox.Show(ex.ToString()); }
    }
    

    Das nervige ist jetzt, ich habe viele solcher Events und mit der oben beschriebenen Methode verdoppelt sich die Anzahl der Funktionen effektiv und man hat sehr viel Redundanz im Code (ständig die gleiche Fehlerbehandlung).

    Deswegen meine Frage, kann man das irgendwie kürzer machen? Am besten fände ich wenn man einfach allen Events eine "default" catch Funktion mitgeben könnte o.ä...





  • Sollte machbar sein indem du einen globalen Handler registrierst:

    static void CatchThreadException(object sender, ThreadExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.ToString());
    }
    
    [STAThread]
    static void Main()
    {
        Application.ThreadException += new ThreadExceptionEventHandler(CatchThreadException);
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    

    Das sollte alle Exceptions aus dem UI Thread abfangen.

    Das wäre eine Lösung für Winforms, für WPF kannst du dich AFAIK bei

    Application.Current.DispatcherUnhandledException
    

    einklinken.



  • Hallo,

    Danke für die Antworten, das sieht genau nach dem aus was ich gesucht habe. Leider funktioniert das aber aus irgendeinem Grund bei mir nicht (ich benutze WinForms)...

    EDIT:
    Lol, es funktioniert doch. Man muss im Debug-Mode nur auf "Weiter" und nicht auf "Break" klicken, dann landet man in dem Handler. Danke auf jeden Fall 👍



  • Andere Möglichkeit:

    void ExecuteGuarded(Action a)
    {
        try
        {
            a();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
    
    void button1_Click(object sender, EventArgs e)
    {
        ExecuteGuarded(() =>
        {
            // Mach was
        });
    }
    

    Verwende ich massig in z.B. Web-Services, um Exceptions zu loggen und bestimmte Exceptions in andere zu konvertieren (damit der Client in bestimmten Fällen einen "fault" gemeldet bekommt mit dem er etwas anfangen kann).


Anmelden zum Antworten