TRY/CATCH_ALL vs try/catch

问题描述:

我一直在使用C++,而且我很熟悉普通的try/catch。不过,我现在发现自己在Windows上编写Visual Studio中的COM开发。代码的几个部分使用类似的东西:TRY/CATCH_ALL vs try/catch

TRY { 
    ... do stuff 
} CATCH_ALL(e) { 
    ... issue a warning 
} 
END_CATCH_ALL; 

这些宏是什么意思?他们提供的内置try/catch有什么好处?

我试过用google搜索这个,但是“尝试vs尝试”很难搜索。

这是一个MFC宏:
http://msdn.microsoft.com/en-us/library/t8dwzac0%28VS.71%29.aspx

This page说,他们是从MFC 1.0的遗迹 - 在新代码普通的C++异常:

MFC版本低于3.0不支持C++异常机制。 MFC提供了宏来处理异常。

+1

但它与使用内置的try/catch相比如何? – Tim 2010-04-14 21:28:06

+1

@Tim:它们只存在,因为MFC 1.0不支持内置的try/catch。所以只是不要使用它们。看看宏定义,如果你关心它们是如何工作的。 – 2010-04-14 21:29:31

+0

“不要使用它们”听起来像是正确的道路。不过,从商业的角度来看,微软给出了同样的建议吗?由于他们是MFC的制造者,所以我希望有一个正式的建议来向其他人展示。 – Tim 2010-04-14 21:35:04

这是Windows编程的一个人造事件,从编译器不能很好地支持try/catch的日子开始,或者完全不被支持。

你要记住,有使用Visual C++编程时,3种不同类型的异常:

  1. C++异常
  2. 结构化异常(SEH,Windows自带的异常处理机制)
  3. MFC异常(您提到的那些,不建议用于新代码但仍可用于向后兼容)

SEH和C++异常机制不应混合使用

这篇文章在MSDN上有更多的细节:

http://msdn.microsoft.com/en-us/library/x057540h.aspx

宏是与编译器的早期版本使用是重要的。它们仍支持与旧代码的兼容性,但不建议使用。

Exception Handling in Visual C++的文件说,这一下MFC例外:

自从3.0版本,MFC采用了C++异常,但仍然支持其 旧的异常处理的宏,这是类似于C++异常 形式。虽然这些宏不建议用于编程,但仍支持它们以实现向后兼容。在 程序已经使用宏,您也可以*使用C++ 例外。在预处理过程中,宏从Visual C++ 2.0版开始,对C++语言的Visual C++实现 中定义的异常处理进行处理。在开始使用C++ 异常时,您可以保留现有的异常宏 。