UnhandledExceptions in einer Klassenbibliothek

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Sobald das Hauptprogramm Deine DLL in einem Try-Block ausführt (wohl sehr wahrscheinlich, um das Fortführen des Hauptprogramms nicht zu gefährden), ist ja die DLL-Exception behandelt. Dann gibt es für das System auch keinen Grund, ein UnhandledException-Event zu feuern. Daher wird AddHandler AppDomain.CurrentDomain.UnhandledException auch nix bringen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Jou.

    Ruzbacky schrieb:

    Mein Verständnis war nur so, dass ich dachte die Anwendung, welche die DLL einbindet kann die UnhandledException fangen und behandeln,
    Was genau stellst Du Dir unter Exception fangen und behandeln vor?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VaporiZed schrieb:

    Sobald das Hauptprogramm Deine DLL in einem Try-Block ausführt (wohl sehr wahrscheinlich, um das Fortführen des Hauptprogramms nicht zu gefährden), ist ja die DLL-Exception behandelt.

    Das wird wohl so sein und erklärt warum alle meine Versuche das UnhandledException-Event auszulösen innerhalb einer DLL erfolglos blieben.

    RodFromGermany schrieb:

    Was genau stellst Du Dir unter Exception fangen und behandeln vor?
    Zunächst möchte ich, dass die Excepion ein Event auslöst und mir somit alle Möglichkeiten gibt zu tun was ich möchte... In diesem konkreten Fall z.B. das Protokollieren der Exception.

    Ruzbacky schrieb:

    und mir somit alle Möglichkeiten gibt zu tun was ich möchte
    Das geht nun mal am besten in dem Try-Catch-Block, der die betreffende Zeile umschließt.
    Event senden ist da kein Problem, problematisch ist es, wenn Du in der Abarbeitung fortfahren willst, ohne Daten zu verlieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    problematisch ist es, wenn Du in der Abarbeitung fortfahren willst, ohne Daten zu verlieren.
    jaja, aber wie ich verstanden habe, ist das Fortfahren gar nicht das (nächste) Ziel des TE, sondern die Fehler ühaupt zu loggen und zu mailen, damit er als Entwickler überhaupt ein zeitnahes Feedback kriegt, wenn im Praxis-Einsatz was schief läuft.
    Eine wirksame Fehlerbehandlung zu entwickeln wäre quasi erst das "Ziel nach dem Ziel"

    ErfinderDesRades schrieb:

    jaja, aber wie ich verstanden habe, ist das Fortfahren gar nicht das (nächste) Ziel des TE, sondern die Fehler ühaupt zu loggen und zu mailen, damit er als Entwickler überhaupt ein zeitnahes Feedback kriegt, wenn im Praxis-Einsatz was schief läuft.
    Eine wirksame Fehlerbehandlung zu entwickeln wäre quasi erst das "Ziel nach dem Ziel"

    So ist es...

    Und mit Try/Catch kann ich natürlich die Exception fangen und entsprechend behandeln, bzw. protokollieren. Mein Problem ist es ja, dass ich noch gar nicht weis wo die Exception auftreten wird, denn wenn mir der Fehler bereits bekannt wäre, dann könnte ich Ihn ja schon zur Entwicklungszeit entsprechend vermeiden. Somit müsste ich ja quasi überall den gesamten Code in einem Try/Catch-Block einschließen, um alle eventuellen Exceptions zu fangen und zu protokollieren.
    Aus diesem Grund auch der krampfhafte Versuch bei einer UnhandledException ein Event zu feuern, um somit global ohne Try/Catch die Exception zu fangen und zu protokollieren.

    Aktuell habe ich einfach um den Formular-Aufruf ein Try/Catch gepackt, um somit die Exceptions die das Formular erzeugt abfangen zu können und zu protokollieren.
    Der Endanwender bekommt dann noch eine freundliche MessageBox, in der er darauf hingewiesen wird das eine Exception aufgetreten ist und deswegen sein Formular beendet wurde.

    VB.NET-Quellcode

    1. Private Sub cmdDrawingProperties_OnExecute(Context As NameValueMap) Handles cmdDrawingProperties.OnExecute
    2. Dim frmForm As New frmDrawingProperties
    3. Try
    4. frmForm.ShowDialog()
    5. Catch ex As Exception
    6. Call LogException(ex)
    7. End Try
    8. End Sub

    Ruzbacky schrieb:

    Somit müsste ich ja quasi überall den gesamten Code in einem Try/Catch-Block einschließen, um alle eventuellen Exceptions zu fangen und zu protokollieren.
    So ist es.
    Um Dir mal das Konzept zu verdeutlichen:
    Erstell mal ein WinForms-Projekt in C#, auch wenn Du von C# keine Ahnung hast.
    Dort wird eine Klasse Program.cs erzeugt, die sieht so aus:
    Spoiler anzeigen

    C#-Quellcode

    1. static class Program
    2. {
    3. /// <summary>
    4. /// Der Haupteinstiegspunkt für die Anwendung.
    5. /// </summary>
    6. [STAThread]
    7. static void Main()
    8. {
    9. Application.EnableVisualStyles();
    10. Application.SetCompatibleTextRenderingDefault(false);
    11. Application.Run(new Form1());
    12. }
    13. }
    Wenn Du um die Zeile

    C#-Quellcode

    1. Application.Run(new Form1());
    ein Try-Catch baust, ist das das, was Du willst.
    Dies kannst Du auch in VB.NET so machen, dazu musst Du aber das Projekt entsprechend modifizieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Wenn Du um die Zeile ein Try-Catch baust, ist das das, was Du willst.
    Dies kannst Du auch in VB.NET so machen, dazu musst Du aber das Projekt entsprechend modifizieren.


    ​Ok, das verstehe ich... Dies entspricht ja in etwa dem was ich getan habe, indem ich um alle meine Aufrufe der Formulare ein Try/Catch gebaut habe. Natürlich ist um den Code, welcher sich außerhalb meiner Formular befindet kein Try/Catch.
    ​Dies ist aber nicht so schlimm für meinen Anwendungsfall, da außerhalb der Formulare der Code eher unkritisch ist und sich alle wirklich kritischen Abläufe innerhalb der Formulare abspielen.

    Ruzbacky schrieb:

    ​Ok, das verstehe ich...
    Glaube ich nicht ganz.
    Hier brauchst Du nur ein einziges Try-Catch.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Glaube ich nicht ganz.
    Hier brauchst Du nur ein einziges Try-Catch.

    Hmm... Aber doch auch nur so lange, wie jede weitere Form über die Form1 aufgerufen, bzw. durch diese instanziert wird.
    Denn der Try/Catch Block umfasst ja auch hier nur Form1. Wenn ich aus Form1 ausbreche und dann eine Exception auftritt, wird diese doch auch nicht mehr gefangen oder sehe ich das falsch?
    Kenne mich leider, wie du bereits richtig festgestellt hast, überhaupt nicht mit C# aus.

    Aber mal ein völlig abstrakter Gedankengang:

    C#-Quellcode

    1. static class Program
    2. {
    3. /// <summary>
    4. /// Der Haupteinstiegspunkt für die Anwendung.
    5. /// </summary>
    6. [STAThread]
    7. static void Main()
    8. {
    9. Application.EnableVisualStyles();
    10. Application.SetCompatibleTextRenderingDefault(false);
    11. /// Start-Szenario 1 tritt ein, dann:
    12. Application.Run(new Form1());
    13. /// Start-Szenario 2 tritt ein, dann:
    14. Application.Run(new Form2());
    15. }
    16. }

    Mir fällt spontan nichts ein, warum es zwei solche Szenarien geben sollte, die dazu führen das beim Anwendungsstart zwischen zwei unterschiedlichen Start-Forms unterschieden werden sollte.
    Aber hier würde ich doch theoretisch auch zwei Try/Catch benötigen oder?

    Vielleicht denke ich aber auch nur viel zu abstrakt...

    Aber so ähnlich verhält es sich ja mit meiner DLL, da diese ja nur ein AddIn darstellt. Denn primär läuft ja die eigentliche Software Autodesk Inventor und erst wenn ich eine der Schaltflächen im Ribbon klicke wird ein Form meines AddIns aufgerufen. So lange keine Schaltfläche geklickt wird, schläft meine DLL quasi im Hintergrund.

    Bitte korrigiere mich, wenn ich hier einen völligen Gedankenfehler habe.
    Ich bin immer gerne bereit mein Wissen zu erweitern.
    Bilder
    • Ribbon.JPG

      16,26 kB, 343×160, 181 mal angesehen
    Mein Senf und Ketchup dazu. Plus Spekulatius:
    Ganz easy Konzept:

    Autodesk-Code:

    Quellcode

    1. Try
    2. StarteAddon
    3. Catch AllExceptions
    4. BeendeAddonUndMeldeFehler
    5. End Try

    Dein AddOnCode mit Sollwert:

    Quellcode

    1. AddOn_Load:
    2. Try
    3. MachDies
    4. MachDas
    5. UndDasZumSchluss
    6. Catch AlleExceptions
    7. InformiereEntwicklerÜberFehler
    8. End Try

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Ruzbacky schrieb:

    Aber doch auch nur so lange, wie jede weitere Form über die Form1 aufgerufen, bzw. durch diese instanziert wird.
    Genau so ist es, 99,8% aller .NET-WinForm-Programme funktionieren so, insbesondere die VB.NET-Programme, dort wird das vom Anwendungsframework im Hintergrund erledigt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!