Как обрабатывать AccessViolationException
Я использую COM-объект (MODI) из моего приложения .net. Метод, который я вызываю, бросает систему.AccessViolationException, который перехватывается Visual Studio. Странно, что я обернул свой вызов в try catch, который имеет обработчики для AccessViolationException, COMException и всего остального, но когда Visual Studio (2010) перехватывает AccessViolationException, отладчик прерывает вызов метода (doc.OCR), и если я пройду через него, он продолжит следующий линии вместо того, чтобы войти в блок catch. Кроме того, если я запускаю это за пределами visual studio, мое приложение аварийно завершает работу. Как я могу обработать это исключение, которое выбрасывается в COM-объект?
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();
}
4 ответов:
в .NET 4.0 среда выполнения обрабатывает определенные исключения, возникающие как ошибки структурированной обработки ошибок Windows (SEH) в качестве индикаторов поврежденного состояния. Эти исключения поврежденного состояния (CSE) не могут быть перехвачены вашим стандартным управляемым кодом. Я не буду вдаваться почему и как здесь. Прочитайте эту статью о CSE в .NET 4.0 Framework:
http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035
но есть надежда. Есть несколько способов обойти это:
Перекомпилируйте как сборку .NET 3.5 и запустите ее в .NET 4.0.
добавьте строку в конфигурационный файл вашего приложения в элементе configuration / runtime:
<legacyCorruptedStateExceptionsPolicy enabled="true|false"/>украсьте методы, которые вы хотите поймать эти исключения в с
добавьте следующее в конфигурационный файл, и он будет пойман в блоке try catch. Слово предостережения... постарайтесь избежать этой ситуации, так как это означает, что происходит какое-то нарушение.
<configuration> <runtime> <legacyCorruptedStateExceptionsPolicy enabled="true" /> </runtime> </configuration>
скомпилированные сверху ответы, работали на меня, делали следующие шаги, чтобы поймать его.
Шаг #1-добавить следующий фрагмент в конфигурационный файл
<configuration> <runtime> <legacyCorruptedStateExceptionsPolicy enabled="true" /> </runtime> </configuration>Шаг #2
добавить
[HandleProcessCorruptedStateExceptions] [SecurityCritical]в верхней части функции вы связываете поймать исключение
источник: http://www.gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html
вы можете попробовать использовать AppDomain.События unhandledexception и посмотреть, если это позволяет его поймать.
* * EDIT*
вот дополнительная информация это может быть полезно (это долго читать).
Comments