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提供了宏来处理异常。
这是Windows编程的一个人造事件,从编译器不能很好地支持try/catch的日子开始,或者完全不被支持。
你要记住,有使用Visual C++编程时,3种不同类型的异常:
- C++异常
- 结构化异常(SEH,Windows自带的异常处理机制)
- MFC异常(您提到的那些,不建议用于新代码但仍可用于向后兼容)
SEH和C++异常机制不应混合使用。
这篇文章在MSDN上有更多的细节:
宏是与编译器的早期版本使用是重要的。它们仍支持与旧代码的兼容性,但不建议使用。
为Exception Handling in Visual C++的文件说,这一下MFC例外:
自从3.0版本,MFC采用了C++异常,但仍然支持其 旧的异常处理的宏,这是类似于C++异常 形式。虽然这些宏不建议用于编程,但仍支持它们以实现向后兼容。在 程序已经使用宏,您也可以自由使用C++ 例外。在预处理过程中,宏从Visual C++ 2.0版开始,对C++语言的Visual C++实现 中定义的异常处理进行处理。在开始使用C++ 异常时,您可以保留现有的异常宏 。
但它与使用内置的try/catch相比如何? – Tim 2010-04-14 21:28:06
@Tim:它们只存在,因为MFC 1.0不支持内置的try/catch。所以只是不要使用它们。看看宏定义,如果你关心它们是如何工作的。 – 2010-04-14 21:29:31
“不要使用它们”听起来像是正确的道路。不过,从商业的角度来看,微软给出了同样的建议吗?由于他们是MFC的制造者,所以我希望有一个正式的建议来向其他人展示。 – Tim 2010-04-14 21:35:04