Partager via


Classe System.AccessViolationException

Cet article fournit des remarques supplémentaires à la documentation de référence de cette API.

Une violation d’accès se produit dans du code non managé ou non sécurisé lorsque le code tente de lire ou d’écrire dans la mémoire qui n’a pas été allouée, ou auquel il n’a pas accès. Cela se produit généralement parce qu’un pointeur a une valeur incorrecte. Toutes les lectures ou écritures par le biais de pointeurs incorrects n’entraînent pas des violations d'accès, donc une violation d'accès indique généralement que plusieurs lectures ou écritures se sont produites via des pointeurs incorrects et que la mémoire peut être endommagée. Ainsi, les violations d’accès indiquent presque toujours des erreurs de programmation graves. Un AccessViolationException identifie clairement ces erreurs graves.

Dans les programmes qui se composent entièrement de code managé vérifiable, toutes les références sont valides ou null, et les violations d’accès sont impossibles. Toute opération qui tente de référencer une référence nulle dans le code vérifiable lève une NullReferenceException exception. Une AccessViolationException survient uniquement lorsque le code managé vérifiable interagit avec du code non managé ou avec du code managé dangereux.

Résoudre les problèmes d’exceptions AccessViolationException

Une AccessViolationException exception peut se produire uniquement dans le code managé non sécurisé ou lorsque le code managé vérifiable interagit avec du code non managé :

  • Une violation d’accès qui se produit dans du code managé non sécurisé peut être exprimée sous la forme d’une exception ou d’une NullReferenceExceptionAccessViolationException exception, selon la plateforme.
  • Une violation d’accès dans du code non managé qui remonte jusqu’au code managé est toujours emballée dans une AccessViolationException exception.

Dans les deux cas, vous pouvez identifier et corriger la cause de l’exception AccessViolationException comme suit :

  • Vérifiez que la mémoire que vous tentez d’accéder a été allouée. Une AccessViolationException exception est toujours générée par une tentative d'accès à la mémoire protégée, c'est-à-dire pour accéder à la mémoire qui n'est pas allouée ou qui n’appartient pas à un processus.

    La gestion automatique de la mémoire est l’un des services fournis par le runtime .NET. Si le code managé fournit les mêmes fonctionnalités que votre code non managé, envisagez de passer au code managé pour tirer parti de cette fonctionnalité. Pour plus d’informations, consultez Gestion automatique de la mémoire.

  • Vérifiez que la mémoire que vous tentez d’accéder n’a pas été endommagée. Si plusieurs opérations de lecture ou d’écriture se sont produites via des pointeurs incorrects, la mémoire peut être endommagée. Cela se produit généralement lors de la lecture ou de l’écriture à des adresses au-delà d’une mémoire tampon prédéfinie.

AccessViolationException et blocs try/catch

AccessViolationException Les exceptions levées par le runtime .NET ne sont pas gérées par l’instruction catch dans un gestionnaire d’exceptions structurées si l’exception se produit en dehors de la mémoire réservée par le runtime.

.NET Framework uniquement : pour gérer une AccessViolationException telle exception, appliquez l’attribut HandleProcessCorruptedStateExceptionsAttribute à la méthode dans laquelle l’exception est levée. Cette modification n’affecte pas les AccessViolationException exceptions levées par le code utilisateur, qui peuvent continuer à être interceptées par une catch instruction.

Avertissement

L’attribut HandleProcessCorruptedStateExceptions est obsolète dans les versions actuelles de .NET. La récupération à partir des exceptions d'état de processus corrompu n’est pas prise en charge, et l’attribut, le cas échéant, n’est pas pris en compte.