Ich verwende ein COM-Objekt (MODI) in meiner .net-Anwendung. Die von mir aufgerufene Methode löst eine System.AccessViolationException aus, die von Visual Studio abgefangen wird. Das Seltsame ist, dass ich meinen Aufruf in einen Try-Catch eingeschlossen habe, der Handler für AccessViolationException, COMException und alles andere enthält. Wenn Visual Studio (2010) die AccessViolationException abfängt, bricht der Debugger den Methodenaufruf (doc.OCR) ab. und wenn ich durchtrete, geht es weiter zur nächsten Zeile, anstatt den Fangblock zu betreten. Wenn ich dies außerhalb des Visual Studios ausführe, stürzt meine Anwendung ab. Wie kann ich mit dieser Ausnahme umgehen, die im COM-Objekt ausgelöst wird?
MODI.Document doc = new MODI.Document();
try
{
doc.Create(sFileName);
try
{
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
sText = doc.Images[0].Layout.Text;
}
catch (System.AccessViolationException ex)
{
//MODI seems to get access violations for some reason, but is still able to return the OCR text.
sText = doc.Images[0].Layout.Text;
}
catch (System.Runtime.InteropServices.COMException ex)
{
//if no text exists, the engine throws an exception.
sText = "";
}
catch
{
sText = "";
}
if (sText != null)
{
sText = sText.Trim();
}
}
finally
{
doc.Close(false);
//Cleanup routine, this is how we are able to delete files used by MODI.
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);
doc = null;
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
Exception
Handler (vorübergehend!) Einzusetzen, um alle Ausnahmen abzufangen und festzustellen, was die Ausnahme tatsächlich ist?Antworten:
In .NET 4.0 behandelt die Laufzeit bestimmte Ausnahmen, die als SEH-Fehler (Windows Structured Error Handling) ausgelöst werden, als Indikatoren für den beschädigten Status. Diese CSE (Corrupted State Exceptions) dürfen von Ihrem standardmäßigen verwalteten Code nicht abgefangen werden. Ich werde nicht auf das Warum oder Wie hier eingehen. Lesen Sie diesen Artikel über CSEs in .NET 4.0 Framework:
http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035
Aber es gibt Hoffnung. Es gibt einige Möglichkeiten, dies zu umgehen:
Kompilieren Sie als .NET 3.5-Assembly neu und führen Sie sie in .NET 4.0 aus.
Fügen Sie der Konfigurationsdatei Ihrer Anwendung unter dem Konfigurations- / Laufzeitelement eine Zeile hinzu:
<legacyCorruptedStateExceptionsPolicy enabled="true|false"/>
Dekorieren Sie die Methoden, mit denen Sie diese Ausnahmen abfangen möchten, mit dem
HandleProcessCorruptedStateExceptions
Attribut. Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035 .BEARBEITEN
Zuvor habe ich für weitere Details auf einen Forumsbeitrag verwiesen . Da Microsoft Connect jedoch eingestellt wurde, finden Sie hier weitere Details, falls Sie interessiert sind:
Von Gaurav Khanna, einem Entwickler des Microsoft CLR-Teams
Anschließend verweist er auf die Dokumentation zum HandleProcessCorruptedStateExceptionsAttribute und den obigen Artikel. Es genügt zu sagen, dass es definitiv eine Lektüre wert ist, wenn Sie erwägen, diese Art von Ausnahmen zu erwischen.
quelle
HandleProcessCorruptedStateExceptions
funktioniert für mich in .Net 4.5.OR
" Vorgehensweise ist. :)Fügen Sie der Konfigurationsdatei Folgendes hinzu, und es wird im try catch-Block abgefangen. Ein Wort der Vorsicht ... versuchen Sie, diese Situation zu vermeiden, da dies bedeutet, dass eine Art Verstoß vorliegt.
quelle
Aus den obigen Antworten zusammengestellt, für mich gearbeitet, folgende Schritte unternommen, um sie zu fangen.
Schritt 1 - Fügen Sie der Konfigurationsdatei das folgende Snippet hinzu
Schritt 2
Hinzufügen -
Oben auf der Funktion binden Sie die Ausnahme
Quelle: http://www.gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html
quelle
Sie können versuchen, AppDomain.UnhandledException zu verwenden, und prüfen, ob Sie es damit abfangen können.
**BEARBEITEN*
Hier sind einige weitere Informationen , die nützlich sein könnten (es ist eine lange Lektüre).
quelle