208 votes

Comment gérer AccessViolationException

Je suis à l'aide d'un objet COM (MODI) à partir de dans mon .net application. La méthode de travail, je lance un appel Système.AccessViolationException, qui est intercepté par Visual Studio. La chose étrange est que j'ai enveloppé mon appel dans un try catch, qui a des gestionnaires pour AccessViolationException, COMException et tout et tout, mais lorsque Visual Studio (2010) intercepte le AccessViolationException, le débogueur se brise sur l'appel de la méthode (doc.OCR), et si je fais un pas de travers, il continue à la ligne suivante au lieu d'entrer dans le bloc catch. En outre, si je l'exécute en dehors de visual studio sur mon application se bloque. Comment puis-je gérer cette exception qui est levée à l'intérieur de l'objet 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();

}

321voto

villecoder Points 5707

Dans .NET 4.0, le moteur d'exécution de gestion de certaines exceptions soulevées comme Windows Structuré de gestion des Erreurs (SEH) les erreurs comme des indicateurs d'un État Corrompu. Ces Corrompus de l'État Exceptions (CST) ne sont pas autorisés à être pris par votre standard de code managé. Je ne rentrerai pas dans le pourquoi ou le comment de ici. Lire cet article au sujet du CST à la .NET Framework 4.0:

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

Mais il y a de l'espoir. Il ya quelques façons de contourner ce problème:

  1. Recompiler un .NET 3.5 de l'assemblée et de l'exécuter .NET 4.0.

  2. Ajouter une ligne à votre fichier de configuration de l'application en vertu de la configuration/exécution de l'élément: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>

  3. Décorer les méthodes que vous voulez attraper ces exceptions avec l' HandleProcessCorruptedStateExceptions d'attribut. Voir http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035 pour plus de détails.

Pour plus de référence: http://connect.microsoft.com/VisualStudio/feedback/details/557105/unable-to-catch-accessviolationexception

20voto

Partha Points 101

Ajoutez ce qui suit dans le fichier de configuration, et il sera pris dans le bloc try catch. Mise en garde ... essayez d'éviter cette situation, car cela signifie qu'une sorte de violation est en train de se produire.

 <configuration>
   <runtime>
      <legacyCorruptedStateExceptionsPolicy enabled="true" />
   </runtime>
</configuration>
 

-1voto

Tony Abrams Points 2718

Vous pouvez essayer d'utiliser AppDomain.UnhandledException et voir si cela vous permet de l'attraper.

* EDIT

Voici quelques informations supplémentaires qui pourraient être utiles (c'est une longue lecture).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X