catch(...)和catch(CException *)之间有什么区别?

时间:2011-09-14 06:33:42

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

CException是VC ++抛出的所有异常的基本类型,因此它应该捕获所有异常,对吧?

3 个答案:

答案 0 :(得分:13)

CException 不是所有扩展的基本类型(它可能是MFC代码使用的所有异常的基本类型,但它就是这样)。

在C ++中,你可以抛出任何东西;它不必是一个“异常”子类,它甚至不必是一个对象。例如,写throw 42;throw new std::vector<string>();

是完全合法的

然后显而易见的是:catch(CException)将仅捕获CException及其子类的抛出实例,而另一个将捕获任何内容。

答案 1 :(得分:2)

throw "ex";

实际上会抛出一个字符串(好吧,const char*,但你知道我的意思。)

catch (TYPE t)

只会捕获TYPE类型的对象(不必是例外)。

答案 2 :(得分:2)

C ++异常可以是任何类型。使用catch(),您可以指定要作为参数捕获的异常的类型。 (...)的特殊情况是,您将捕获您在之前的捕获中未指定的任何其他异常。

C ++中标准库的异常基础是std :: exception。为了捕获所有异常,C ++程序中的标准方法如下:

(例如在主要功能中)

try
{

}
catch( const std::exception & e )
{
// catch standard exceptions, you can use e.what() to know what exception you caught
}
catch( ... )
{
// catch all other types but you can't do much with them
}

即使可能,也不建议抛出不从std :: exception继承的异常。但是CException似乎并没有继承它。

在您的情况下,我建议您执行以下操作以捕获可能出现的所有异常(例如,在主函数和主线程函数中):

try
{
}
catch( const CException & e )
{
// catch all CExceptions
//as far as I know it is ok now to catch CException by reference with modern Microsoft compilers? It was not always the recommended microsoft way
}
catch( const std::exception & e )
{
// catch standard C++ exception
}
catch( ... )
{
// catch others
}

与往常一样,如果不习惯,了解什么是标准C ++以及什么是Windows API可能会很棘手。