[.NET] Global Exception Handling

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von styxx, 20. Februar 2008 .

  1. 20. Februar 2008
    Global Exception Handling

    Suche nach einer Möglichkeit Exceptions in C# (Net 2.0) global abzufangen.

    Soll rein zu Debuggingzwecken dienen, da ich keiner Lust habe "tausende" try und catch zu schreiben, um sie im nachhinein wieder zu löschen und die Exception mit "richtigem" Code zu verhindern.

    Code:
     public frmMain()
     {
     InitializeComponent();
     AppDomain mCurrentDomain = AppDomain.CurrentDomain;
     mCurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(mHandler); 
     }
    
     static void mHandler(object sender, UnhandledExceptionEventArgs args)
     {
     Exception e = (Exception)args.ExceptionObject;
     //Debug(e.Message);
     }
    Funktioniert soweit (die Pseudomethode Debug wird aufgerufen) nur wird die Exception dadurch nicht "behandelt", sondern das Programm stürzt trotzdem ab.

    Gibt es eine Möglichkeit dies zu verhindern? Sodass einfach die Methode Debug ausgeführt und die Exception ignoriert wird?
    Bin für jede Hilfe dankbar, da es wie gesagt nur um das Debugging geht und ich an meinem Problem nicht Stunden "verschwenden" will.
     
  2. 20. Februar 2008
    AW: Global Exception Handling

    Verdammt, bedankt -.-

    Du könntest bei den Methoden jeweils ein throw machen, dann wird die Exception immer zur aufrufenden Methode "weitergeworfen"...
     
  3. 20. Februar 2008
    AW: Global Exception Handling

    ??

    Es geht in erster Linie darum die bereits "vorhandene" Exceptions global abzufangen, nicht darum neue Exceptions zu erzeugen... (throw new Exception)

    Ich hoffe ich hab dich richtig verstanden...
     
  4. 20. Februar 2008
    AW: Global Exception Handling

    Hast mich wohl falsch verstanden.
    zum beispiel einfach:
    Code:
    public void FooBar() throws Exception
    {
    ...
    }
    Dann kannst dir in der Methode schonmal das try und catch sparen. gibts ein fehler wird dieser an die aufrufenden Methoden weitergegeben. Dann brauchen entweder die wieder ein throws oder ein try und catch.

    Im prinzip kannst das so weit führen das du nur ein einziges try im Main() machst...
     
  5. 20. Februar 2008
    AW: Global Exception Handling

    Dein Programm wird doch in der Datei program.cs gestartet, bzw. deine frmMain wird instanziiert und geöffnet.
    Mach doch einfach einen Try-Catch-Block um diesen "Application.Run( ... )" wie unten angezeigt.

    Dann werden die Exceptions spätestens dort geschmissen und du kannst sie abfangen.

    Code:
    /// <summary>
    /// Der Haupteinstiegspunkt für die Anwendung.
    /// </summary>
    [STAThread]
    static void Main()
    {
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
     
    
     try
     {
     Application.Run(new Form1() /* oder was auch immer du machst */);
     }
     catch (Exception e)
     {
     // do sth here
     }
    
    }
     
  6. 20. Februar 2008
    AW: Global Exception Handling

    Warum kompliziert wenns auch einfach geht.... X(

    Bw an beide raus, werd wohl den Vorschlag von Tanya verwenden.

    Edit: Das von Tanya funktioniert zwar, nur leider auch nicht besser als mein erster Versuch: Das Programm stürzt nach dem catch block trotzdem ab. (logischerweise)
     
  7. 20. Februar 2008
    AW: Global Exception Handling

    anders gehts auch nicht

    so wie ich das verstehe möchtest du also das er die exeption wirft
    trotzdem weiter macht und ganz am ende kümmerst du dich um sie?
     
  8. 20. Februar 2008
    AW: Global Exception Handling

    Ja fast, nur das ich mich nicht direkt um "sie kümmern" will sondern einfach in einem log speichern
    Das Hauptproblem ist, dass das programm abstürzt, selbst wenn eine "unwichtige" methode eine Exception wirft. Würde ich in der Methode ein try/catch einbauen würde das Programm nach der Exception normal weiterlaufen...
    Wenn ich die exception aber komplett "durchfallen" lassen (Tanya Vorschlag), dann ist der Mainthread von der Exception auch betroffen und stürzt damit ab.
     
  9. 20. Februar 2008
    AW: Global Exception Handling

    ja aber eine exeption ist ja ein fehler
    und du wirst den compiler nicht dazu bekommen bei fehler einfach weiter zu machen, weil für ihn dürfte jeder fehler gleich schlimm sein

    da wirst du nicht um einige try catch drumrum kommen
     
  10. 20. Februar 2008
    AW: Global Exception Handling


    Gerade das funktioniert, wenn bei der Exception der Mainthread nicht betroffen ist.
    Sprich wenn du eine Exception in einer Methode hast, dann wird zwar die Methode beendet, aber das Programm läuft weiter... Wenn die Exception der Methode aber erst im Mainthread abgefangen wird, stürzt dieser dann auch mit ab.
    Es funktioniert definitiv ohne catch und try, google liefert dafür zumindest Beweise, nur leider keinen gescheiten Code...
     
  11. 20. Februar 2008
    AW: Global Exception Handling

    gut dann nehme ich alles zurück und behaubte das gegenteil

    aber leider kan ich dir da nicht weiter helfen, aber wieso behebst du nicht einfach die exeption wenn sie auftreten?
     
  12. 24. Februar 2008
    AW: Global Exception Handling

    Geht es hier um ein Windows- oder eine Webapplikation? Oder eine Class-Library?

    Falls es um eine Webapplikation geht, kannst Du in der Datei Global.asax die Funktion
    Code:
    Application_Error()
    nutzen.
    Code:
    Server.LastError()
    gibt Dir die letzte geschmissene Exception zurück.

    Hoffe das hilft.

    BG MaxDev
     
  13. 27. Februar 2008
    AW: Global Exception Handling

    Wenns um eine windows function hilft dir vielleicht das:

    zu finden in der ApplicationEvents.vb
     
  14. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.