Compartilhar via


Acionando exceções de software

Algumas das origens mais comuns de erros do programa não são sinalizadas como exceções pelo sistema. Por exemplo, se você tenta alocar um bloco de memória, mas não há memória suficiente, o tempo de execução ou a função de API não geram uma exceção, mas retornam um código de erro.

Porém, você pode tratar qualquer condição como uma exceção detectando essa condição em seu código e relatando-a chamando a função RaiseException. Ao sinalizar erros dessa maneira, você aproveitas as vantagens de manipulação de exceções estruturada em qualquer tipo de erro de tempo de execução.

Para usar a manipulação de exceção estruturada com erros:

  • Defina seu próprio código de exceção para o evento.

  • Chame RaiseException quando você detectar um problema.

  • Use filtros de manipulação de exceções para testar o código de exceção definido.

O arquivo <winerror.h> mostra o formato dos códigos de exceção. Para verificar se você não definiu um código em conflito com um código de exceção existente, defina o terceiro bit mais significativo como 1. Os quatro bit mais significativos devem ser definidos como mostrado na tabela a seguir.

Bits Configuração binária recomendada Descrição
31-30 11 Esses dois bits descrevem o status básico de código: 11 = erro, 00 = êxito, 01 = informativo, 10 = aviso.
29 1 Bit cliente. Definido como 1 para códigos definidos pelo usuário.
28 0 Bit reservado. (Deixe definido como 0.)

Você pode definir os dois primeiros bits com uma configuração diferente do 11 binário se você desejar, embora a configuração de “erro” seja apropriada para a maioria das exceções. É importante lembrar de definir os bits 29 e 28 conforme mostrado na tabela anterior.

Portanto, o código de erro resultante deve ter os quatro bits mais altos definidos como hexadecimal E. Por exemplo, as definições a seguir definem códigos de exceção que não entram em conflito com nenhum código de exceção do Windows. (No entanto, talvez seja necessário verificar se os códigos são usados por DLL de terceiros.)

#define STATUS_INSUFFICIENT_MEM       0xE0000001
#define STATUS_FILE_BAD_FORMAT        0xE0000002

Depois que você tiver definido um código de exceção, poderá usá-lo para gerar uma exceção. Por exemplo, o seguinte código gera a exceção STATUS_INSUFFICIENT_MEM em resposta a um problema de alocação de memória:

lpstr = _malloc( nBufferSize );
if (lpstr == NULL)
    RaiseException( STATUS_INSUFFICIENT_MEM, 0, 0, 0);

Se você quiser simplesmente gerar uma exceção, pode definir os últimos três parâmetros como 0. Os últimos três parâmetros são úteis para passar informações adicionais e definir um sinalizador que impeça manipuladores de continuarem a execução. Consulte a função RaiseException no SDK do Windows para obter mais informações.

Em seus filtros de manipulação de exceções, você pode testar os códigos que você definiu. Por exemplo:

__try {
    ...
}
__except (GetExceptionCode() == STATUS_INSUFFICIENT_MEM ||
        GetExceptionCode() == STATUS_FILE_BAD_FORMAT )

Confira também

Escrevendo um manipulador de exceção
Tratamento de exceções estruturado (C/C++)