多年前我偶然发现了Andrei Alexandrescu和Petru Marginean撰写的这篇文章,该文章介绍并讨论了一个名为ScopeGuard的实用程序类,用于编写异常安全的代码.我想知道使用这些对象进行编码是否真的能够产生更好的代码,或者是否会混淆错误处理,或许可以在catch块中更好地呈现guard的回调?有没有人在实际生产代码中使用这些经验?
它肯定会改善您的代码.你的初步声明,它是模糊的,并且代码在catch
块中的优点在C++中是不正确的,因为RAII是一个既定的习惯用法.C++中的资源处理是通过资源获取完成的,垃圾收集是通过隐式析构函数调用完成的.
另一方面,显式catch
块会使代码膨胀并引入细微的错误,因为代码流变得更加复杂,并且必须明确地完成资源处理.
RAII(包括ScopeGuard
s)在C++中并不是一种模糊的技术,而是坚定地建立了最佳实践.
是.
如果有一个C++代码,我建议每个C++程序员花10分钟学习,那就是ScopeGuard(现在是免费提供的Loki库的一部分).
我决定尝试使用(稍微修改过的)ScopeGuard版本来处理我正在研究的小型Win32 GUI程序.您可能知道Win32有许多不同类型的资源需要以不同方式关闭(例如,内核句柄通常是关闭的CloseHandle()
,GDI BeginPaint()
需要与之配对EndPaint()
等)我使用ScopeGuard来获取所有这些资源,并且还用于分配工作缓冲区new
(例如,用于与Unicode之间的字符集转换).
令我感到惊讶的是这个项目有多短. 基本上,这是双赢的:您的代码同时变得更短,更健壮.未来的代码更改不会泄漏任何东西.他们只是不能.多么酷啊?