可能重复:
Determining exception type after the exception is caught?
跟进此question,我想在 catch(...)块中打印出当前异常 - 仅用于记录。有一个答案说没有标准的方法可以做到这一点,但我不喜欢不回答:-)
current_exception()是在网络上的各个地方提到的功能,但显然不是很好的支持。有什么想法吗?毕竟,即使是C也有错误。
因为它可以被重新抛出(使用简单的** throw *),异常对象必须以某种方式可用。
我正在使用MSVS 9.0。
编辑:结论似乎是不可能的。
答案 0 :(得分:7)
如果您只关心编写代码时所了解的异常,那么您可以编写一个处理所有“已知”异常的处理程序。诀窍是重新抛出用catch(...)
捕获的异常,然后捕获各种已知的异常...
所以,比如:
try
{
...
}
catch(...)
{
if (!LogKnownException())
{
cerr << "unknown exception" << endl;
}
}
其中LogKnownException()
看起来像这样:
bool LogKnownException()
{
try
{
throw;
}
catch (const CMyException1 &e)
{
cerr << "caught a CMyException: " << e << endl;
return true;
}
catch (const Blah &e)
{
...
}
... etc
return false;
}
答案 1 :(得分:1)
确定可以抛出哪些异常,并使用一组catch处理程序来捕获一组涵盖它们的常见基类型。
至于从catch(...)获取异常对象,它无法移植,据我所知,使用Microsoft编译器或gcc完全无法完成。是什么让你认为异常对象仍然存在于catch(...)处理程序中?
答案 2 :(得分:0)
您可以打开RTTI并使用typeOf功能。 current_exception
纯粹是stl函数,仅适用于stl异常
作为建议,每个异常类型使用不同的catch(exctype)
。这将使生活更轻松。
答案 3 :(得分:0)
就像alemjerus已经说过:current_exception仅适用于stl异常。 要获得各种stl错误,您还可以写:
#include <stdexcept>
#include <exception> //ecxeption (base class)
#include <new> //bad_alloc
#include <typeinfo> //bad_cast und bad_typeid
#include <ios> //ios_base::failure
...
try
{
...
}
catch(std::exception& e)
{
cerr<<"Error: "<<e.what()<<endl;
}