在VC ++中使用try / catch来理解异常的类型

时间:2012-12-03 09:40:41

标签: c++ visual-c++ exception exception-handling try-catch

  

可能重复:
  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 ++中没有包的概念?

2 个答案:

答案 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条款中,您准备好捕捉。