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

6

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


实际上你需要 catch(CException*),即指向 CException 的指针。请参考:http://msdn.microsoft.com/en-us/library/0e5twxsh.aspx - Adi Shavit
感谢@adi-shavit,我已经更正了标题。 - Bhalchandra K
3个回答

14

CException并不是所有扩展的基础类型(它可能是MFC代码使用的所有异常的基础类型,但仅限于此)。

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

区别很明显:catch(CException)只会捕获抛出的CException及其子类的实例,而另一个将捕获任何东西。


我不确定提到新分配的指针抛出异常是否明智(不建议这样做),以及通过值来捕获异常也是不明智的(也不要这样做)。在 C++ 中,您可以抛出任何东西,但这也不被推荐。 - Nikko
@Nikko:在我看来,throw/catch的“最佳实践”超出了问题的范围。 - Jon
1
为什么不呢?我认为我们应该提供展示最佳实践的示例。 - Nikko
@Nikko:这个问题是理论性的 - Jon
请注意,catch(CException) 可能无法捕获任何 MFC 异常,因为 MFC 抛出的是 CException* 异常。您必须使用 catch(CException*) - Adi Shavit

3

C++异常可以是任何类型。在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。


2
throw "ex";

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

catch (TYPE t)

只会捕获类型为TYPE的对象(不一定是异常)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接