0

可能重复:
在捕获异常后确定异常类型?

我知道 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 块中发生的异常类型,因为我们在 VC++ 中没有包的概念?

4

2 回答 2

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

于 2012-12-03T10:16:16.090 回答
0

在 C++ 中,您通常指定可以捕获的类型catch,而不是检查类型。

如果你想记录一个被捕获的最派生类型std::exception,那么你可以通过 获取该信息typeid,因为std::exception它是一种多态类型。

如果您对记录标准异常类型层次结构之外的异常类型感兴趣,那么一个好方法是通用捕获(使用...)并调用一个通用的重新抛出函数,该函数知道可能的非标准异常并重新抛出和catches 那些。这集中了逻辑。但很可能您的问题不是关于这种有点先进和罕见的技术(仅与使用非良好行为库有关),而是关于 C++ 中异常处理的简单误解,答案是,指定相关类型在每个catch子句中,您准备好捕捉。

于 2012-12-03T10:41:02.807 回答