Laden...

Exception Handling in einem Delegate

Erstellt von Nejox vor 2 Jahren Letzter Beitrag vor 2 Jahren 280 Views
N
Nejox Themenstarter:in
19 Beiträge seit 2016
vor 2 Jahren
Exception Handling in einem Delegate

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 🙂

16.827 Beiträge seit 2008
vor 2 Jahren

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

N
Nejox Themenstarter:in
19 Beiträge seit 2016
vor 2 Jahren

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.

16.827 Beiträge seit 2008
vor 2 Jahren

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 🙂

N
Nejox Themenstarter:in
19 Beiträge seit 2016
vor 2 Jahren

Also müsste ich vorher sicherstellen das alle Parameter einen Wert haben bevor die Methode aufgerufen wird?.

16.827 Beiträge seit 2008
vor 2 Jahren

Richtig.
Das nennt sich Defensives Programmieren und gehört zu den Grundbausteinen von Software Qualität

N
Nejox Themenstarter:in
19 Beiträge seit 2016
vor 2 Jahren

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.

16.827 Beiträge seit 2008
vor 2 Jahren

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.