Funções <exception>
current_exception
Obtém um ponteiro inteligente para a exceção atual.
exception_ptr current_exception();
Valor de retorno
Um objeto exception_ptr que aponta para a exceção atual.
Comentários
Chame a função current_exception
em um bloco catch. Se uma exceção estiver em voo e o bloco catch puder capturar a exceção, a função current_exception
retornará um objeto exception_ptr
que faz referência à exceção. Caso contrário, a função retornará um objeto exception_ptr
nulo.
A função current_exception
captura a exceção que está em voo, independentemente de a instrução catch
especificar uma instrução exception-declaration.
O destruidor da exceção atual será chamado no fim do bloco catch
se você não puder relançar a exceção. No entanto, mesmo que você chame a função current_exception
no destruidor, a função retornará um objeto exception_ptr
que faz referência à exceção atual.
As chamadas sucessivas à função current_exception
retornam objetos exception_ptr
que se referem a diferentes cópias da exceção atual. Consequentemente, os objetos são comparados como diferentes, pois se referem a diferentes cópias, mesmo quando as cópias têm o mesmo valor binário.
make_exception_ptr
Cria um objeto exception_ptr que mantém a cópia de uma exceção.
template <class E>
exception_ptr make_exception_ptr(E Except);
Parâmetros
Except
A classe com a exceção a ser copiada. Normalmente, você especifica um objeto de classe de exceção como o argumento para a função make_exception_ptr
, embora qualquer objeto de classe possa ser o argumento.
Valor de retorno
Um objeto exception_ptr que aponta para uma cópia da exceção atual de Except.
Comentários
Chamar a função make_exception_ptr
é equivalente a lançar uma exceção C++, capturá-la em um bloco catch e chamar a função current_exception para retornar um objeto exception_ptr
que faça referência à exceção. A implementação da função make_exception_ptr
da Microsoft é mais eficiente do que lançar e depois capturar uma exceção.
Geralmente, um aplicativo não exige a função make_exception_ptr
e não recomendamos seu uso.
rethrow_exception
Lança uma exceção passada como um parâmetro.
void rethrow_exception(exception_ptr P);
Parâmetros
P
A exceção capturada para relançamento. Se P for um exception_ptr nulo, a função gerará .std::bad_exception.
Comentários
Depois de armazenar uma exceção capturada em um objeto exception_ptr
, o thread primário poderá processar o objeto. Em seu thread primário, chame a função rethrow_exception
juntamente com o objeto exception_ptr
como seu argumento. A função rethrow_exception
extrai a exceção do objeto exception_ptr
e a lança no contexto do thread primário.
get_terminate
Obtém a função terminate_handler
atual.
terminate_handler get_terminate();
set_terminate
Estabelece um novo terminate_handler
a ser chamado na finalização do programa.
terminate_handler set_terminate(terminate_handler fnew) throw();
Parâmetros
fnew
A função a ser chamada no encerramento.
Valor de retorno
O endereço da função anterior que costumava ser chamada no encerramento.
Comentários
A função estabelece um novo terminate_handler como a função * fnew. Portanto, fnew não deve ser um ponteiro nulo. A função retorna o endereço do manipulador de encerramento anterior.
Exemplo
// exception_set_terminate.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>
using namespace std;
void termfunction()
{
cout << "My terminate function called." << endl;
abort();
}
int main()
{
terminate_handler oldHandler = set_terminate(termfunction);
// Throwing an unhandled exception would also terminate the program
// or we could explicitly call terminate();
//throw bad_alloc();
terminate();
}
get_unexpected
Obtém a função unexpected_handler
atual.
unexpected_handler get_unexpected();
rethrow_if_nested
template <class E>
void rethrow_if_nested(const E& e);
Comentários
Se não for um tipo de classe polimórfica ou se nested_exception
estiver inacessível ou for ambíguo, não haverá efeito. Caso contrário, executa uma conversão dinâmica.
set_unexpected
Estabelece um novo unexpected_handler
a ser chamado quando uma exceção inesperada é encontrada.
unexpected_handler set_unexpected(unexpected_handler fnew) throw();
Parâmetros
fnew
A função a ser chamada quando uma exceção inesperada é encontrada.
Valor de retorno
O endereço do unexpected_handler
anterior.
Comentários
fnew não deve ser um ponteiro nulo.
O padrão C++ requer que unexpected
seja chamado quando uma função lançar uma exceção que não está em sua lista de lançamento. A implementação atual não dá suporte a isso. O exemplo a seguir chama unexpected
diretamente, que, em seguida, chama unexpected_handler
.
Exemplo
// exception_set_unexpected.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>
using namespace std;
void uefunction()
{
cout << "My unhandled exception function called." << endl;
terminate(); // this is what unexpected() calls by default
}
int main()
{
unexpected_handler oldHandler = set_unexpected(uefunction);
unexpected(); // library function to force calling the
// current unexpected handler
}
{1>terminate<1}
Chama um manipulador de finalização.
void terminate();
Comentários
A função chama um manipulador de encerramento, uma função de tipo void
. Se terminate
é chamado diretamente pelo programa, o manipulador de encerramento é o mais recentemente definido por uma chamada a set_terminate. Se terminate
é chamado por qualquer um dos vários outros motivos durante a avaliação de uma expressão de lançamento, o manipulador de encerramento é aquele em vigor imediatamente depois de avaliar a expressão de lançamento.
Um manipulador de encerramento não pode retornar a seu chamador. Na inicialização do programa, o manipulador de encerramento é uma função que chama abort
.
Exemplo
Consulte set_unexpected para obter um exemplo do uso de terminate
.
throw_with_nested
template <class T> [[noreturn]]
void throw_with_nested(T&& t);
Comentários
Gera exceção com exceções aninhadas.
uncaught_exception
Retornará true
apenas se uma exceção lançada estiver sendo processada no momento.
bool uncaught_exception();
Valor de retorno
Retorna true
depois de concluir a avaliação de uma expressão de lançamento e antes de concluir a inicialização da declaração de exceção no manipulador correspondente ou chamar inesperados como resultado da expressão de lançamento. Em particular, uncaught_exception
retornará true
quando chamado de um destruidor que está sendo invocado durante um desenrolamento de exceção. Em dispositivos, uncaught_exception
só tem suporte no Windows CE 5.00 e versões posteriores, incluindo as plataformas Windows Mobile 2005.
Exemplo
// exception_uncaught_exception.cpp
// compile with: /EHsc
#include <exception>
#include <iostream>
#include <string>
class Test
{
public:
Test( std::string msg ) : m_msg( msg )
{
std::cout << "In Test::Test(\"" << m_msg << "\")" << std::endl;
}
~Test( )
{
std::cout << "In Test::~Test(\"" << m_msg << "\")" << std::endl
<< " std::uncaught_exception( ) = "
<< std::uncaught_exception( )
<< std::endl;
}
private:
std::string m_msg;
};
// uncaught_exception will be true in the destructor
// for the object created inside the try block because
// the destructor is being called as part of the unwind.
int main( void )
{
Test t1( "outside try block" );
try
{
Test t2( "inside try block" );
throw 1;
}
catch (...) {
}
}
In Test::Test("outside try block")
In Test::Test("inside try block")
In Test::~Test("inside try block")
std::uncaught_exception( ) = 1
In Test::~Test("outside try block")
std::uncaught_exception( ) = 0
inesperado
Chama o manipulador inesperado.
void unexpected();
Comentários
O padrão C++ requer que unexpected
seja chamado quando uma função lançar uma exceção que não está em sua lista de lançamento. A implementação atual não dá suporte a isso. O exemplo chama unexpected
diretamente, que chama o manipulador inesperado.
A função chama um manipulador inesperado, uma função de tipo void
. Se unexpected
é chamado diretamente pelo programa, o manipulador inesperado é o mais recentemente definido por uma chamada a set_unexpected.
Um manipulador inesperado não pode retornar a seu chamador. Ele pode encerrar a execução:
Lançando um objeto de um tipo listado na especificação de exceção ou um objeto de qualquer tipo, se o manipulador inesperado for chamado diretamente pelo programa.
Lançando um objeto do tipo bad_exception.
Chamando terminate,
abort
ouexit
.
Na inicialização do programa, o manipulador inesperado é uma função que chama terminate.
Exemplo
Consulte set_unexpected para obter um exemplo do uso de unexpected
.