Compartilhar via


Combinando C (estrutura) e exceções de C++

Se você quiser escrever um código mais portátil, não recomendamos o uso de tratamento de exceções estruturadas em um programa C/C++. No entanto, às vezes você pode querer compilar com /EHa e combinar exceções estruturadas e código-fonte em C++, e precisar de algum recurso para tratar os dois tipos de exceções. Como um manipulador estruturado de exceções não tem o conceito de objetos ou de exceções tipadas, ela não consegue tratar as exceções lançadas por código C++. No entanto, os manipuladores de C++ catch podem tratar exceções estruturadas. Por isso, a sintaxe de tratamento de exceções C++ (try, throw, catch) não é aceita pelo compilador C, mas a sintaxe de tratamento de exceções estruturadas (__try, __except, __finally) é suportada pelo compilador C++.

Consulte _set_se_translator para obter informações sobre o tratamento de exceções estruturadas como exceções C++.

Se você combinar exceções estruturadas e exceções C++, observe o seguinte:

  1. As exceções C++ e as exceções estruturadas não podem ser combinadas na mesma função.

  2. Os manipuladores de término (blocos __finally) são sempre executados, mesmo durante o desenrolamento depois que uma exceção é lançada.

  3. A manipulação de exceção C++ pode capturar e preservar semânticas de desenrolamento em todos os módulos compilados com a opção de compilador /EH (essa opção permite a semântica de desenrolamento).

  4. Pode haver algumas situações nas quais as funções de destruidor não sejam chamadas de todos os objetos. Por exemplo, se uma exceção estruturada ocorre ao tentar fazer uma chamada de função por meio de um ponteiro de função não inicializado, e essa função usar como parâmetros objetos que foram criados antes da chamada, os destruidores desses objetos não serão chamados durante o desenrolamento de pilha.

Que mais você deseja saber?

Consulte também

Referência

Tratamento de exceções C++