Distribución de excepciones

Cuando se produce una excepción de hardware o software, el procesador detiene la ejecución en el momento en el que se produjo la excepción y transfiere el control al sistema. En primer lugar, el sistema guarda el estado de la máquina del subproceso actual e información que describe la excepción. A continuación, el sistema intenta encontrar un controlador de excepciones para controlar la excepción.

Estado de la máquina del subproceso en el que se guardó la excepción en una estructura de CONTEXT. Esta información (denominada registro de contexto) permite al sistema continuar la ejecución en el momento de la excepción si la excepción se controla correctamente. La descripción de la excepción (denominada registro de excepciones) se guarda en una estructura EXCEPTION_RECORD. Dado que almacena la información dependiente de la máquina del registro de contexto por separado de la información independiente de la máquina del registro de excepción, el mecanismo de control de excepciones es portátil a distintas plataformas.

La información de los registros de contexto y de excepción está disponible mediante la función GetExceptionInformation y se puede poner a disposición de los controladores de excepciones que se ejecutan como resultado de la excepción. El registro de excepciones incluye la siguiente información.

  • Código de excepción que identifica el tipo de excepción.
  • Marcas que indican si la excepción es continuable. Cualquier intento de continuar la ejecución después de una excepción no continua genera otra excepción.
  • Puntero a otro registro de excepciones. Esto facilita la creación de una lista vinculada de excepciones si se producen excepciones anidadas.
  • Dirección en la que se produjo la excepción.
  • Matriz de argumentos que proporcionan información adicional sobre la excepción.

Cuando se produce una excepción en el código en modo de usuario, el sistema usa el siguiente orden de búsqueda para buscar un controlador de excepciones:

  1. Si se está depurando el proceso, el sistema notifica al depurador. Para obtener más información, consulte control de excepciones del depurador.
  2. Si el proceso no se está depurando o si el depurador asociado no controla la excepción, el sistema intenta localizar un controlador de excepciones basado en fotogramas buscando los marcos de pila del subproceso en el que se produjo la excepción. El sistema busca primero el marco de pila actual y, a continuación, busca en marcos de pila anteriores en orden inverso.
  3. Si no se encuentra ningún controlador basado en fotogramas o no se controla la excepción, pero el proceso se está depurando, el sistema notifica al depurador una segunda vez.
  4. Si el proceso no se está depurando o si el depurador asociado no controla la excepción, el sistema proporciona el control predeterminado en función del tipo de excepción. Para la mayoría de las excepciones, la acción predeterminada es llamar a la función exitProcess.

Cuando se produce una excepción en el código en modo kernel, el sistema busca en los marcos de pila de la pila del kernel en un intento de localizar un controlador de excepciones. Si no se puede encontrar un controlador o no se controla la excepción, el sistema se apaga como si se hubiera llamado a la función exitWindows .