Embora esta pergunta seja bastante antiga e já tenha sido bastante respondida, eu só quero adicionar uma nota sobre como fazer o tratamento adequado de exceções em C ++ 11, uma vez que estou continuamente perdendo isso nas discussões sobre exceções:
É descrito em StackOverflow aqui e aqui , como você pode obter um backtrace em suas exceções dentro de seu código sem a necessidade de um depurador ou registro complicado, simplesmente escrevendo um manipulador de exceção adequado que irá relançar exceções aninhadas.
Visto que você pode fazer isso com qualquer classe de exceção derivada, você pode adicionar muitas informações a esse backtrace! Você também pode dar uma olhada no meu MWE no GitHub , onde um backtrace seria mais ou menos assim:
Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"
Você nem mesmo precisa criar uma subclasse std::runtime_error
para obter muitas informações quando uma exceção é lançada.
O único benefício que vejo na criação de subclasses (em vez de apenas usar std::runtime_error
) é que seu manipulador de exceções pode capturar sua exceção personalizada e fazer algo especial. Por exemplo:
try
{
// something that may throw
}
catch( const MyException & ex )
{
// do something specialized with the
// additional info inside MyException
}
catch( const std::exception & ex )
{
std::cerr << ex.what() << std::endl;
}
catch( ... )
{
std::cerr << "unknown exception!" << std::endl;
}