Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Exception Handling in einem Delegate
Nejox
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

Exception Handling in einem Delegate

beantworten | zitieren | melden

Hallo zusammen,

Ich rufe mir eine externe DLL mittels Delegaten auf. Dabei muss jeder Parameter gesetzt sein sonst gibt es eine Speicher verletzung.
Wenn eine Speicher verletzung auftritt möchte ich dies gerne abfangen das mein Programm nicht abstürzt. Jedoch scheint ein Try Catch in einem Delegaten nicht so einfach zu funktionieren da das Programm weiterhin abstürzt.

Mein Delegate sieht wie folgt aus.


[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int Module(
            string name,
            string vName,
            string geschlecht,
            string alter);

Der Aufruf des Delegaten sieht so aus


protected override void LoadModuleFall()
{
   try
   {
       MyClass parameter = new MyClass (parameter);
                
       ModuleFalldaten loadData = (Module)Marshal.GetDelegateForFunctionPointer(Funktion, typeof(Module));
       loadData (
                    parameter.name,
                    parameter.vName,
                    parameter.geschlecht,
                    parameter.alter);
    }
    catch (Exception ex)
    {
     // Exception ausgeben
    }
}           

Es würde mich freuen wenn mir jemand helfen könnte wie man dieses Problem lösen kann :-)
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16103

beantworten | zitieren | melden

Von welcher Exception genau sprichst Du?
Es gibt Exception-Typen, die kannst Du nicht abfangen, zB weil sie nicht direkt durch die Runtime kommen.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Nejox
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Eine allgemeine Exception, keine bestimmte.
Es muss ja auch nicht unbedingt ein Try Catch sein. Ich bräuchte halt etwas das wenn es zu einem Fehler kommt mir das Programm nicht abstürzen lässt ich mir aber eine Fehlermeldung speichern kann.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Nejox am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16103

beantworten | zitieren | melden

Allgemeines Exception Handling Best Practises
Exception Handling - C# Programming Guide
Best Practices for exceptions - .NET

Dann kommt es noch auf den Anwendungstyp an, da es in ASP.NET Core andere Best Practises gibt als zB. in WPF für das "generelle Loggen".
Serilog zB kann man bei den meisten Applikationstypen als Standard Factory Logger registrieren.

Mit Deinem aktuellen Code fängst Du die Exception lokal ab, aber wie gesagt, gewisse Exceptions kannst Du nicht fangen, egal wo.
Und dazu gehören die meisten Speicherverletzungsmeldungen, wie Du es im Startbeitrag gefragt hast.

Wenn Du eine andere Frage hast, wie man generell Exceptions fängt, dann ist das mit dem erste Teil dieses Beitrags beantwortet :-)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Nejox
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Also müsste ich vorher sicherstellen das alle Parameter einen Wert haben bevor die Methode aufgerufen wird?.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16103

beantworten | zitieren | melden

Richtig.
Das nennt sich Defensives Programmieren und gehört zu den Grundbausteinen von Software Qualität
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Nejox
myCSharp.de - Member



Dabei seit:
Beiträge: 19

Themenstarter:

beantworten | zitieren | melden

Ok danke für die Antwort.
Dann muss ich jetzt nur noch eine ordentliche Möglichkeit finden das zu prüfen.
Die Parameter in meinen Code waren nur Beispiele. Das können bis zu 50 Parameter sein... leider muss ich diese DLL benutzen und hab kein einfluss darauf.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16103

beantworten | zitieren | melden

Machst ne Abstrahierung, hier weit verbreitet eine Art von Provider.
Und auf Dein Call-Modell packst ne Validierung drauf.

Zählt beides mehr oder minder zu den Alltagspattern.
Ist also nicht mega komplex oder aufwändig.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers