Controlar las excepciones

El sistema operativo usa el control estructurado de excepciones para indicar ciertos tipos de errores. Una rutina llamada por un controlador puede generar una excepción que el controlador debe controlar.

El sistema intercepta los siguientes tipos generales de excepciones:

  1. Errores o capturas definidos por hardware, como,

    • Infracciones de acceso (consulte a continuación)
    • Desalineaciones de tipo de datos (por ejemplo, una entidad de 16 bits alineada en un límite de bytes impares)
    • Instrucciones no válidas y con privilegios
    • Secuencias de bloqueo no válidas (intentando ejecutar una secuencia de instrucciones no válidas dentro de una sección interbloqueada del código)
    • Entero se divide por cero y desbordamientos
    • El punto flotante se divide por cero, desbordamientos, subflujos y operandos reservados
    • Puntos de interrupción y ejecución de un solo paso (para admitir depuradores)
  2. Excepciones definidas por software del sistema, como,

    • Infracciones de la página de protección (intentando cargar o almacenar datos desde o hacia una ubicación dentro de una página de protección)
    • Errores de lectura de página (intentando leer una página en la memoria y encontrar un error de E/S simultáneo)

Una infracción de acceso es un intento de realizar una operación en una página que no está permitida en la configuración de protección de páginas actual. Las infracciones de acceso se producen en las situaciones siguientes:

  • Una operación de lectura o escritura no válida, como escribir en una página de solo lectura.

  • Para acceder a la memoria más allá del límite del espacio de direcciones del programa actual (conocido como infracción de longitud).

  • Para acceder a una página que reside actualmente, pero dedicada al uso de un componente del sistema. Por ejemplo, no se permite el acceso al código en modo de usuario a una página que usa el kernel.

Si una operación puede provocar una excepción, el controlador debe incluir la operación en un bloque try/except . Los accesos de las ubicaciones en modo de usuario son causas típicas de excepciones. Por ejemplo, la rutina ProbeForWrite comprueba que el controlador realmente puede escribir en un búfer en modo de usuario. Si no es posible, la rutina genera una excepción de STATUS_ACCESS_VIOLATION. En el ejemplo de código siguiente, el controlador llama a ProbeForWrite en un try/except para que pueda controlar la excepción resultante, si se debe producir una.

try {
    ...
    ProbeForWrite(Buffer, BufferSize, BufferAlignment);
 
    /* Note that any access (not just the probe, which must come first,
     * by the way) to Buffer must also be within a try-except.
     */
    ...
} except (EXCEPTION_EXECUTE_HANDLER) {
    /* Error handling code */
    ...
}

Los controladores deben controlar las excepciones generadas. Una excepción que no se controla hace que el sistema compruebe el error. El controlador que hace que se genere la excepción debe controlarla: un controlador de nivel inferior no puede depender de un controlador de nivel superior para controlar la excepción.

Los controladores pueden generar directamente una excepción mediante las rutinas ExRaiseAccessViolation, ExRaiseDatatypeMisalignment o ExRaiseStatus . El controlador debe controlar las excepciones que generen estas rutinas.

A continuación se muestra una lista parcial de rutinas que, al menos en determinadas situaciones, pueden generar una excepción:

Los accesos de memoria a los búferes en modo de usuario también pueden provocar infracciones de acceso. Para obtener más información, vea Errores en referencia a direcciones de User-Space.

Tenga en cuenta que el control estructurado de excepciones es distinto de las excepciones de C++. El kernel no admite excepciones de C++.

Para obtener más información sobre el control estructurado de excepciones, consulte la Microsoft Windows SDK y la documentación de Visual Studio.