Как обрабатывать 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();

}
711   4  

4 ответов:

в .NET 4.0 среда выполнения обрабатывает определенные исключения, возникающие как ошибки структурированной обработки ошибок Windows (SEH) в качестве индикаторов поврежденного состояния. Эти исключения поврежденного состояния (CSE) не могут быть перехвачены вашим стандартным управляемым кодом. Я не буду вдаваться почему и как здесь. Прочитайте эту статью о CSE в .NET 4.0 Framework:

http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035

но есть надежда. Есть несколько способов обойти это:

  1. Перекомпилируйте как сборку .NET 3.5 и запустите ее в .NET 4.0.

  2. добавьте строку в конфигурационный файл вашего приложения в элементе configuration / runtime: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>

  3. украсьте методы, которые вы хотите поймать эти исключения в с

добавьте следующее в конфигурационный файл, и он будет пойман в блоке 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

    Ничего не найдено.