CException
是VC++抛出所有异常的基本类型,因此它应该捕获所有异常,对吗?
CException
是VC++抛出所有异常的基本类型,因此它应该捕获所有异常,对吗?
CException
并不是所有扩展的基础类型(它可能是MFC代码使用的所有异常的基础类型,但仅限于此)。
在C++中,你可以抛出任何东西;它不必是“exception”子类,甚至不必是一个对象。例如,写throw 42;
或throw new std::vector<string>()
都是合法的。
区别很明显:catch(CException)
只会捕获抛出的CException
及其子类的实例,而另一个将捕获任何东西。
catch(CException)
可能无法捕获任何 MFC 异常,因为 MFC 抛出的是 CException*
异常。您必须使用 catch(CException*)
。 - Adi ShavitC++异常可以是任何类型。在catch()中,您需要将要捕获的异常类型作为参数指定。特殊情况是使用(...),这样您就可以捕获之前未指定的任何其他异常。
C++标准库中异常的基础是std::exception。在C++程序中,捕获所有异常的标准方式如下:
(例如,在main函数中)
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。
throw "ex";
实际上会抛出一个字符串(好吧,const char*
,但你知道我的意思)。
catch (TYPE t)
只会捕获类型为TYPE的对象(不一定是异常)。
catch(CException*)
,即指向CException
的指针。请参考:http://msdn.microsoft.com/en-us/library/0e5twxsh.aspx - Adi Shavit