Especificações de exceção
As especificações de exceção são o recurso de linguagem de C++ que é substituído em C++0x.Foram criados para fornecer informações de resumo sobre exceções que podem ser lançadas fora de uma função, mas foram encontradas na prática para ser problemáticas.A especificação de uma exceção que provou ser um pouco útil foi a especificação throw ().Por exemplo:
void MyFunction(int i) throw();
informa o compilador que a função não gera nenhuma exceções.é o equivalente a usar __declspec (nothrow).Seu uso é considerado opcional.Em C++0x, o operador de noexcept é apresentado, mas suporte para esse recurso não ainda está presente no Visual C++ até a data do Visual Studio 2012.
Visual C++ parte do padrão ANSI em sua implementação de especificações de exceção.A tabela a seguir resume a implementação do Visual C++ de especificações de exceção:
Especificação de exceção |
Significado |
---|---|
throw () |
A função não gera uma exceção.Em o entanto, se uma exceção é lançada fora de um throw marcado função (), o compilador do Visual C++ não chamará inesperado (consulte unexpected (CRT) e unexpected (<exception>) para obter mais informações).Se uma função está marcada com throw (), o compilador do Visual C++ assumirá que a função não lança exceções C++ e não gera código de acordo.Devido às otimizações de código que podem ser executadas pelo compilador C++ (baseado na suposição que a função não lança exceções nenhuma C++) se uma função gera uma exceção, o programa não pode executar corretamente. |
lance (...) |
A função pode lançar uma exceção. |
throw (type) |
A função pode lançar uma exceção de tipo type.Em o entanto, no Visual C++ .NET, isso é interpretado como o throw (...).Consulte Especificadores de exceção de função. |
Se a manipulação de exceção é usada em um aplicativo, deve haver uma ou mais funções que tratam exceções geradas.Todas as funções chamadas entre essa que lança uma exceção e aquela que lida com a exceção devem ser capazes de programação lançar uma exceção.
O comportamento throw de uma função depende dos seguintes fatores:
Se você estiver criando a função em C ou C++.
A opção de compilador /EH você usar.
Se você especificar explicitamente a especificação de exceção.
As especificações explícitas de exceção não são permitidas em funções de C.
A tabela a seguir resume o comportamento throw de uma função:
Função |
/EHsc |
/EHs |
/EHa |
/EHac |
---|---|---|---|---|
Função de C |
throw () |
lance (...) |
lance (...) |
lance (...) |
Função C++ sem a especificação de exceção |
lance (...) |
lance (...) |
lance (...) |
lance (...) |
Função C++ com especificação de exceção throw () |
throw () |
throw () |
lance (...) |
lance (...) |
Função C++ com especificação de exceção throw (...) |
lance (...) |
lance (...) |
lance (...) |
lance (...) |
Função C++ com especificação de exceção throw (type) |
lance (...) |
lance (...) |
lance (...) |
lance (...) |
Exemplo
// exception_specification.cpp
// compile with: /EHs
#include <stdio.h>
void handler() {
printf_s("in handler\n");
}
void f1(void) throw(int) {
printf_s("About to throw 1\n");
if (1)
throw 1;
}
void f5(void) throw() {
try {
f1();
}
catch(...) {
handler();
}
}
// invalid, doesn't handle the int exception thrown from f1()
// void f3(void) throw() {
// f1();
// }
void __declspec(nothrow) f2(void) {
try {
f1();
}
catch(int) {
handler();
}
}
// only valid if compiled without /EHc
// /EHc means assume extern "C" functions don't throw exceptions
extern "C" void f4(void);
void f4(void) {
f1();
}
int main() {
f2();
try {
f4();
}
catch(...) {
printf_s("Caught exception from f4\n");
}
f5();
}