В деструкторе существует ли способ определить, обрабатывается ли какое-либо исключение?Есть ли способ определить, произошло ли исключение?
ответ
Вы можете использовать std :: uncaught_exception(), но он может не делать то, что вы думаете, что он делает: см. GoTW#47 для получения дополнительной информации.
Вы можете использовать Boost Test Library. Вот небольшой пример:
struct my_exception1
{
explicit my_exception1(int res_code) : m_res_code(res_code) {}
int m_res_code;
};
struct my_exception2
{
explicit my_exception2(int res_code) : m_res_code(res_code) {}
int m_res_code;
};
class dangerous_call {
public:
dangerous_call(int argc) : m_argc(argc) {}
int operator()()
{
if(m_argc < 2)
throw my_exception1(23);
if(m_argc > 3)
throw my_exception2(45);
else if(m_argc > 2)
throw "too many args";
return 1;
}
private:
int m_argc;
};
void translate_my_exception1(my_exception1 const& ex)
{
std::cout << "Caught my_exception1(" << ex.m_res_code << ")"<< std::endl;
}
void translate_my_exception2(my_exception2 const& ex)
{
std::cout << "Caught my_exception2(" << ex.m_res_code << ")"<< std::endl;
}
int
cpp_main(int argc , char *[])
{
::boost::execution_monitor ex_mon;
ex_mon.register_exception_translator<my_exception1>(
&translate_my_exception1);
ex_mon.register_exception_translator<my_exception2>(
&translate_my_exception2);
try{
// ex_mon.detect_memory_leak(true);
ex_mon.execute(::boost::unit_test::callback0<int>(
dangerous_call(argc)));
}
catch (boost::execution_exception const& ex) {
std::cout << "Caught exception: " << ex.what() << std::endl;
}
return 0;
}
Вам необходимо вникнуть в документацию. Это очень мощная библиотека для тестирования вашего программного обеспечения! Во всяком случае, с помощью Boost вы можете поймать любое исключение, которое будет храниться в любом месте вашего тестового теста!
Конечно, ваша тестовая функция может находиться внутри структуры, где вы перегружаете оператор() ... и там вы можете поместить свой тест, чтобы узнать, какое сгенерировано исключение. – Eddie 2008-09-24 13:03:15
Как сказал Люк, вы можете использовать std :: uncaught_exception(). Но почему вы хотите знать? В любом случае, destructors should never throw exceptions!
Это пахнет подозрительным. Зачем вам нужен другой вид очистки, если произошло исключение? – Pramod 2008-09-24 12:59:09
Согласованные Подозрительные. И вы никогда не захотите выбрасывать из деструктора ИМО. Но вы можете выбросить деструктор, но если вы выбросите деструктор, а другое исключение распространится, приложение прекратит работу (без выхода или нормальной очистки). – 2008-09-24 15:06:40