2010-02-23 30 views
6

可能重复:
Determining exception type after the exception is caught?如何确定catch(...)块中的当前异常?

这个question跟进,我想在捕获(...)块打印出当前异常 - 只记录。有一个答案表示没有这样做的标准方式,但我不喜欢没有回答:-)

current_exception()是在网络上的各个地方提到的函数,但显然不是很好的支持。对此有何想法?毕竟,即使C有errno

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

我正在使用MSVS 9.0。

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

+4

我不明白这个问题与你引用的不同。只因为你不喜欢答案就没有理由再次提问。 – 2010-02-23 17:53:24

+0

我同意马克。但是,也许你没有意识到,你可以使用接受的答案技巧来捕获所有常见异常的基类,如捕获std :: exception&和可以作为CException *捕获的MFC。 – 2010-02-23 18:03:49

+0

这个问题有点不同:另一个问题是关于识别异常的类型,而这个人想打印尽可能多的有关异常的信息。 – 2011-12-02 14:10:22

回答

0

您可以打开RTTI并使用typeOf函数。 current_exception纯粹是stl函数,仅适用于stl异常。
作为建议,每个异常类型使用不同的catch(exctype)。这会让生活变得更容易。

+2

'catch(...)'不给你一个引用的对象,所以你不知道类型。 RTTI是否适用于POD类型,如int? – 2010-02-23 17:51:39

1

像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; 
} 
1

确定可以抛出什么异常,并使用一组catch处理的赶了一组常见的基本类型,涵盖所有。


至于正从捕获的异常对象(...),它不能做可移植性而据我所知,它不能在所有使用微软编译器GCC或完成。是什么让你认为异常对象仍然存在于catch(...)处理程序中?

+2

>“是什么让你认为异常对象仍然存在于catch(...)处理程序中?” 因为它可以被重新抛出(用一个简单的“throw”),该对象必须在某处。 – 2010-02-25 08:34:30

+0

如果catch(...)是顶级捕获处理程序? as-if规则将赋予编译器在方便时销毁对象。但我怀疑这是在实践中发生的。 – 2010-02-25 10:09:16

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