如何确定catch(...)块中的当前异常?

时间:2010-02-23 17:42:03

标签: c++ visual-studio exception

  

可能重复:
  Determining exception type after the exception is caught?

跟进此question,我想在 catch(...)块中打印出当前异常 - 仅用于记录。有一个答案说没有标准的方法可以做到这一点,但我不喜欢不回答:-)

current_exception()是在网络上的各个地方提到的功能,但显然不是很好的支持。有什么想法吗?毕竟,即使是C也有错误

因为它可以被重新抛出(使用简单的** throw *),异常对象必须以某种方式可用。

我正在使用MSVS 9.0。

编辑:结论似乎是不可能的。

4 个答案:

答案 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;
}