Despacho de exceções

Quando ocorre uma exceção de hardware ou software, o processador interrompe a execução no ponto em que a exceção ocorreu e transfere o controle para o sistema. Primeiro, o sistema salva o estado da máquina do thread atual e as informações que descrevem a exceção. Em seguida, o sistema tenta encontrar um manipulador de exceção para lidar com a exceção.

O estado da máquina do thread no qual a exceção ocorreu é salvo em um CONTEXT estrutura. Essas informações (chamadas de registro de contexto ) permitem que o sistema continue a execução no ponto da exceção se a exceção for tratada com êxito. A descrição da exceção (chamada de registro de exceção ) é salva em uma estrutura EXCEPTION_RECORD. Como armazena as informações dependentes da máquina do registro de contexto separadamente das informações independentes da máquina do registro de exceção, o mecanismo de tratamento de exceções é portátil para diferentes plataformas.

As informações nos registros de contexto e exceção estão disponíveis por meio da funçãoGetExceptionInformatione podem ser disponibilizadas para qualquer manipulador de exceção que seja executado como resultado da exceção. O registro de exceção inclui as seguintes informações.

  • Um código de exceção que identifica o tipo de exceção.
  • Sinalizadores que indicam se a exceção é contínua. Qualquer tentativa de continuar a execução após uma exceção não continuável gera outra exceção.
  • Um ponteiro para outro registro de exceção. Isso facilita a criação de uma lista vinculada de exceções se ocorrerem exceções aninhadas.
  • O endereço no qual a exceção ocorreu.
  • Uma matriz de argumentos que fornecem informações adicionais sobre a exceção.

Quando ocorre uma exceção no código de modo de usuário, o sistema usa a seguinte ordem de pesquisa para localizar um manipulador de exceções:

  1. Se o processo estiver sendo depurado, o sistema notificará o depurador. Para obter mais informações, consulte Debugger Exception Handling.
  2. Se o processo não estiver sendo depurado ou se o depurador associado não manipular a exceção, o sistema tentará localizar um manipulador de exceção baseado em quadro pesquisando os quadros de pilha do thread no qual a exceção ocorreu. O sistema pesquisa primeiro o quadro de pilha atual e, em seguida, pesquisa os quadros de pilha anteriores em ordem inversa.
  3. Se nenhum manipulador baseado em quadro puder ser encontrado, ou nenhum manipulador baseado em quadro manipular a exceção, mas o processo estiver sendo depurado, o sistema notificará o depurador uma segunda vez.
  4. Se o processo não estiver sendo depurado ou se o depurador associado não manipular a exceção, o sistema fornecerá tratamento padrão com base no tipo de exceção. Para a maioria das exceções, a ação padrão é chamar a funçãoExitProcess.

Quando ocorre uma exceção no código do modo kernel, o sistema pesquisa os quadros de pilha da pilha do kernel na tentativa de localizar um manipulador de exceções. Se um manipulador não puder ser localizado ou nenhum manipulador manipular a exceção, o sistema será desligado como se a função ExitWindows tivesse sido chamada.