C++ 如何确定catch(…)块中的当前异常?

C++ 如何确定catch(…)块中的当前异常?,c++,visual-studio,exception,C++,Visual Studio,Exception,可能重复: 接下来,我想在一个catch(…)块中打印出当前异常——只是为了记录。有一个答案是,没有标准的方法可以做到这一点,但我不喜欢以“不”作为答案:-) current_exception()是一个在web上的多个地方都提到过的函数,但显然没有得到很好的支持。有什么想法吗?毕竟,即使是C也有错误 因为它可以被重新调用(通过简单的**抛出*),所以异常对象必须以某种方式可用 我正在使用MSVS9.0 编辑:结论似乎是这是不可能的。您可以打开RTTI并使用typeOf函数当前_异常纯粹是st

可能重复:

接下来,我想在一个catch(…)块中打印出当前异常——只是为了记录。有一个答案是,没有标准的方法可以做到这一点,但我不喜欢以“不”作为答案:-)

current_exception()是一个在web上的多个地方都提到过的函数,但显然没有得到很好的支持。有什么想法吗?毕竟,即使是C也有错误

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

我正在使用MSVS9.0


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

您可以打开RTTI并使用typeOf函数<代码>当前_异常纯粹是stl功能,仅适用于stl异常。

建议每个异常类型使用不同的
catch(exctype)
。这将使生活变得更加轻松。

就像alemjerus已经说过的:当前的\u异常只适用于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;
}
#包括
#include//ecxeption(基类)
#包括//bad\u alloc
#包括//错误类型和错误类型ID
#include//ios\u base::failure
...
尝试
{
...
}
捕获(标准::异常&e)
{

cerr确定可以抛出哪些异常,并使用一组捕获处理程序捕获一组涵盖所有异常的公共基类型



至于从catch(…)中获取异常对象,它不能以可移植的方式完成,而且据我所知,使用Microsoft编译器或gcc根本无法完成。是什么让你认为catch(…)中仍然存在异常对象处理程序?

如果您在编写代码时只关心您知道的异常,那么您可以编写一个处理程序来处理所有“已知”异常。诀窍是重新显示您用
捕获(…)
捕获的异常,然后捕获各种已知异常

比如说:

try
{
 ...
}
catch(...)
{
   if (!LogKnownException())
   {
      cerr << "unknown exception" << endl;
   }
}

捕获(…)
没有给你一个要引用的对象,所以你不知道它的类型。RTTI对POD类型(如int)有效吗?我看不出这个问题与你引用的问题有什么不同。仅仅因为你不喜欢答案就没有理由再问了。我同意Mark的观点。但是,也许你没有意识到,你可以使用接受的答案捕获所有常见异常的基类的技术,如捕获std::exception&和可以捕获为CException*的MFC。问题有点不同:另一个问题是关于识别异常的类型,而这个问题希望打印尽可能多的异常信息。>“是什么让你认为异常对象仍然存在于catch(…)处理程序中?”因为它可以被重新调用(只需一个简单的“throw”),对象必须在某个地方。如果catch(…)是顶级catch处理程序吗?似乎规则将使编译器有权在方便的时候销毁对象。但我怀疑在实践中会发生这种情况。这不是真的。std::current_异常适用于任何异常类型。
bool LogKnownException()
{
   try
   {
      throw;
   }
   catch (const CMyException1 &e)
   {
      cerr << "caught a CMyException: " << e << endl;

      return true;
   }
   catch (const Blah &e)
   {
      ...
   }
   ... etc

   return false;
}