Compartilhar via


Combinação de exceções C (estruturadas) e C++

Se você quiser gravar um código portátil, não recomendamos o uso de tratamento de exceções estruturadas (SEH) em um programa C++. No entanto, às vezes, você pode querer compilar usando /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 de tipo, ele não consegue tratar as exceções lançadas por código C++. No entanto, os manipuladores C++ catch podem lidar com exceções estruturadas. Por isso, a sintaxe de tratamento de exceção 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ê misturar exceções estruturadas e C++, esteja ciente desses possíveis problemas:

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

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

  • A manipulação de exceção C++ pode capturar e preservar as semânticas de desenrolamento em todos os módulos compilados com as opções de compilador /EH, que permite a semântica de desenrolamento.

  • Pode haver algumas situações nas quais as funções de destruidor não sejam chamadas de todos os objetos. Por exemplo, uma exceção estruturada pode ocorrer ao tentar fazer uma chamada de função por meio de um ponteiro de função não inicializado. Se os parâmetros de função forem objetos construídos antes da chamada, os destruidores desses objetos não serão chamados durante o desenrolar da pilha.

Próximas etapas

Confira também

Práticas recomendadas do C++ modernas para tratamento de erros e exceções