可能重复:
Determining exception type after the exception is caught?
我知道C#中的异常处理:
try{
// code causing exception
}
catch(System.Exception e){
// Here e variable holds the information about the actual exception that has occured in try block.
}
但是,我想在VC ++中实现同样的功能(在VS 2008上)。 我们如何捕获VC ++中try块中出现的 TYPE类型,因为我们在VC ++中没有包的概念?
答案 0 :(得分:1)
c ++中没有一个基类用于所有异常,因此唯一的选择是指定要处理的内容
try
{
}
catch (const std::exception& e)
{
}
catch (const my_base_exception& e)
{
}
catch (const some_library_base_exception& e)
{
}
catch (...)
{
// ups something unknown
}
请记住,如果您的my_base_exception
来自std::exception
,它将被catch (const std::exception& e)
拦截,因此如果是这种情况,则交换这两次捕获。同样适用于some_library_base_exception
答案 1 :(得分:0)
在C ++中,您通常指定 catch
可以捕获的类型,而不是检查类型。
如果您想记录被捕获的std::exception
的派生类型最多,那么您可以通过typeid
获取该信息,因为std::exception
是多态类型。
如果您对记录标准异常类型hierarhcy之外的异常类型感兴趣,那么一个好方法是一般地捕获(使用...
)并调用一个知道可能的公共rethrower函数非标准异常和重新抛出以及catch
这些。这集中了逻辑。但很可能你的问题不是关于这种有点先进和罕见的技术(仅与使用不良行为的库相关),而是关于C ++中的异常处理的简单误解,答案是,指定相关类型在每个catch
条款中,您准备好捕捉。