CException
是VC ++抛出的所有异常的基本类型,因此它应该捕获所有异常,对吧?
答案 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可能会很棘手。