Partilhar via


Gerar exceções de Software

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

No entanto, você pode tratar qualquer condição como uma exceção, detectando essa condição no seu código e, em seguida, reportá-lo chamando o RaiseException função.Por sinalizar erros dessa maneira, você pode trazer vantagens da qualquer tipo de erro de tempo de execução de manipulação de exceção estruturada.

Para usar o tratamento com erros de exceção estruturada:

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

  • Chame RaiseException quando você detecta um problema.

  • Use filtros de manipulação de exceção para testar o código de exceção que você definiu.

O WINERROR.Arquivo h mostra o formato para códigos de exceção.Para certificar-se de que você não definir um código que está em conflito com um código de exceção existente, defina o bit terceiro mais significativo como 1.Os quatro bits mais significativos devem ser definidos como mostrado na tabela a seguir.

Bits

Configuração recomendada de binária

Descrição

31-30

11

Esses dois bits descrever o status básico do código: 11 = erro, 00 = sucesso, 01 = informativas, 10 = aviso.

29

1

Bit do cliente.Definido como 1 para os códigos definidos pelo usuário.

28

0

Bits reservados.(Deixe definido como 0).

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

O código de erro resultante, portanto, deve ter os quatro bits mais altos definido como hexadecimal e.Por exemplo, as seguintes definições definem códigos de exceção que não entrem em conflito com quaisquer códigos de exceção do Windows.(Você pode, Entretanto, necessário verificar quais códigos são usados por terceiros DLLs.)

#define STATUS_INSUFFICIENT_MEM       0xE0000001
#define STATUS_FILE_BAD_FORMAT        0xE0000002

Após ter definido um código de exceção, você pode usá-lo para elevar uma exceção.Por exemplo, o código a seguir gera a exceção de 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 elevar uma exceção, você pode definir os três últimos parâmetros como 0.Os três últimos parâmetros são úteis para passar informações adicionais e definindo um sinalizador que impede que os manipuladores continuando a execução.Consulte o RaiseException funcionar a Windows SDK para obter mais informações.

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

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

Consulte também

Referência

Escrever um manipulador de exceção

(C++) de manipulação de exceção estruturada