Compartir a través de


Clase de excepción System.AccessViolationException

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

Una infracción de acceso se produce en código no administrado o no seguro cuando el código intenta leer o escribir en la memoria que no se ha asignado o al que no tiene acceso. Esto suele ocurrir porque un puntero tiene un valor incorrecto. No todas las lecturas o escrituras a través de punteros incorrectos conducen a infracciones de acceso, por lo que una infracción de acceso suele indicar que se han producido varias lecturas o escrituras a través de punteros incorrectos y que la memoria podría estar dañada. Por lo tanto, las infracciones de acceso casi siempre indican errores de programación graves. Una AccessViolationException claramente identifica estos errores graves.

En los programas que constan completamente de código administrado verificable, todas las referencias son válidas o nulas, y las infracciones de acceso son imposibles. Cualquier operación que intente hacer referencia a una referencia nula en el código verificable produce una NullReferenceException excepción. Un AccessViolationException solo se produce cuando el código administrado verificable interactúa con el código no administrado o con código administrado no seguro.

Solución de problemas de excepciones de AccessViolationException

Una AccessViolationException excepción solo puede producirse en código administrado no seguro o cuando el código administrado verificable interactúa con código no administrado:

  • Una infracción de acceso que se produce en código administrado no seguro se puede expresar como una NullReferenceException excepción o una AccessViolationException excepción, en función de la plataforma.
  • Una infracción de acceso en código no administrado que sube al código administrado siempre se encapsula en una excepción AccessViolationException.

En cualquier caso, puede identificar y corregir la causa de la excepción de la AccessViolationException siguiente manera:

  • Asegúrese de que se ha asignado la memoria a la que intenta acceder. Una AccessViolationException excepción siempre se produce por un intento de acceder a la memoria protegida, es decir, para acceder a la memoria que no está asignada o que no es propiedad de un proceso.

    La administración automática de memoria es uno de los servicios que proporciona el entorno de ejecución de .NET. Si el código administrado proporciona la misma funcionalidad que el código no administrado, considere la posibilidad de pasar al código administrado para aprovechar esta funcionalidad. Para obtener más información, consulte Administración automática de memoria.

  • Asegúrese de que la memoria a la que está intentando acceder no se ha dañado. Si se han producido varias operaciones de lectura o escritura a través de punteros incorrectos, es posible que la memoria esté dañada. Esto suele ocurrir al leer o escribir en direcciones fuera de un búfer predefinido.

AccessViolationException y bloques de 'try/catch'

AccessViolationException Las excepciones producidas por el entorno de ejecución de .NET no se controlan mediante la catch instrucción en un controlador de excepciones estructurado si la excepción se produce fuera de la memoria reservada por el tiempo de ejecución.

Solo .NET Framework: para controlar esta AccessViolationException excepción, aplique el HandleProcessCorruptedStateExceptionsAttribute atributo al método en el que se produce la excepción. Este cambio no afecta a las excepciones AccessViolationException producidas por el código de usuario, que pueden seguir siendo capturadas por una instrucción catch.

Precaución

El atributo HandleProcessCorruptedStateExceptions está obsoleto en las versiones actuales de .NET. No se admite la recuperación del estado del proceso dañado: no se admiten excepciones y el atributo, si está presente, se omite.