System.Reflection.TargetInvocationException wird nicht abgefangen
NOTE ADDED AFTER SOLUTION: In der durch Reflection aufgerufenen Methode wurde eine AccessViolationException ausgelöst. Dies war der Grund, warum die TargetInvocationException nicht abgefangen werden konnte.
HINWEIS: Dies ist AUSSERHALB der IDE. Die Frage, auf die verwiesen wird, ist NICHT dieselbe.
TL; DR
Kann keinen Stack-Trace erhalten Kann keine inneren Ausnahmen bekommen Debugger kann nicht verwendet werden (Kopierschutzschema einer Drittanbieter-Bibliothek steht im Weg) Änderungen am Code verhindern das Auftreten der Ausnahme. Das bedeutet, dass ich keine Protokollierung hinzufügen kann, um herauszufinden, wo die Ausnahme auftritt.Wie kann ich die Ausnahme abfangen oder die erforderlichen Informationen auf andere Weise abrufen?
Lange Beschreibung
Ich habe ein Problem mit einer Ausnahme, die in einer Methode auftritt, die durch Reflektion aufgerufen wird. Die Ausnahme selbst tritt tatsächlich in der aufgerufenen Methode auf, aber da die Methode durch Reflektion aufgerufen wird, wird die echte Ausnahme in ein @ eingeschlosseSystem.Reflection.TargetInvocationException
. Kein Problem, fange es einfach und erhalte die interne Ausnahme - außer demSystem.Reflection.TargetInvocationException
wird nicht erwischt. Mein Programm stürzt ab und ich erhalte einen Speicherauszug zusammen mit einem Eintrag im Windows-Ereignisprotokoll.
Das Windows-Ereignisprotokoll enthält weder die internen Ausnahmen noch den Speicherauszug. Ich kann keinen Debugger an das Programm anhängen, da dann eine externe Bibliothek (die zum Aufrufen der Reflection benötigt wird) nicht ausgeführt wird - Kopierschutz, wissen Sie nicht. Wenn ich ein try / catch in die anstößige Methode eingebe, tritt die Ausnahme nicht auf - was schlecht ist. Die Ursache ist nicht behoben, es passiert einfach nicht mehr. Der gleiche Effekt tritt auf, wenn ich die Protokollierung in die anstößige Methode versetze - die Ausnahme tritt nicht mehr auf.
Ich kann die Protokollierung nicht verwenden, ich kann keinen Debugger verwenden, und an der einen Stelle, an der ich die Ausnahme abfangen und protokollieren konnte, wird die Ausnahme nicht abgefangen.
Ich verwende Visual Studio 2010 und dotnet 4.0.
Um es klar zu machen: Das try / catch funktioniert nicht, wenn das Programm außerhalb von Visual Studio ausgeführt wird, und ich kann es nicht innerhalb von Visual Studio im Debugger ausführen, da das Programm dann nicht den Punkt erreichen kann, an dem das Ausnahme tritt auf. Dies ist NICHT in der IDE.
Beseitigen der Reflektion ist keine Option (Ich habe es nur für den einen Fall versucht, und die Ausnahme geht weg.)
Die aufgerufene Methode erledigt eine Menge Dinge, aber die Aufteilung in kleinere Methoden hilft nicht weiter - die Ausnahme verschwindet einfach.
Die Ausnahme tritt nicht immer auf, nur wenn ich eine bestimmte Abfolge von Schritten durchführe - und wenn sie auftritt, ist es immer das zweite Mal während der gesamten Abfolge.
In der Sequenz, die ich verwende, wird die Methode von zwei Threads fast gleichzeitig aufgerufen - ein bestimmter Datenblock wird eingegeben, wodurch eine Kopie eines Berichts und eines anderen Dokuments auf zwei separaten Druckern gedruckt wird - jeweils ein Bericht und ein Dokument Drucker. Da das Generieren der Berichte und das Drucken des Dokuments eine Weile dauern kann, werden sie in Threads im Hintergrund ausgeführt, damit der Benutzer weiterarbeiten kann.
Ich vermute, dass die Threads sich gegenseitig auf die Füße treten (viele Datei- und Datenbankmanipulationen laufen), aber ohne zu wissen, was wirklich passiert, kann ich es nicht reparieren.
Der folgende Code zeigt eine vereinfachte Version des Aufrufs durch Reflektion.
Hat jemand einen Vorschlag, was das @ verursachen könntSystem.Reflection.TargetInvocationException
nicht erwischt zu werden, oder vielleicht eine alternative Möglichkeit, die innere Ausnahme zu erwischen?
Try
Dim methode As System.Reflection.MethodInfo
methode = GetType(AParticularClass).GetMethod("OneOfManyMethods", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static)
Dim resultobject As Object = methode.Invoke(Nothing, Reflection.BindingFlags.InvokeMethod Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static, Nothing, New Object() {SomeBooleanVariable, SomeStringVariable}, Nothing)
result = DirectCast(resultobject, DataSet)
Catch ex As Exception
'Log the error here.
End Try