
Hello Gregory, Monday, April 9, 2007, 4:36:36 AM, you wrote:
Well, I'm very late to this thread of discussion, but I'd like to add my $0.02.
Why would we go through so much complexity? Remember the simple and basic principle of RAII? In situations like this, you just make a simple wrapper of the FILE*, with an implementation similar to that of a smart pointer such as the auto_ptr, and let's name it auto_cfile, with a "FILE*&()" operator member function to expose the FILE* it protects:
auto_cfile f(std::fopen("/etc/passwd","r")); ..... (uses of f as if it were a FILE*)
and the FILE* is automatically closed by auto_cfile's dtor when it goes out of scope.
No need of a "try ... catch" block at all, much less of "finally," which is an unnecessary addition in C#, IMHO.
<snip>
In a case as simple as FILE* I may agree with you. But sometimes I have to do something more complicated than fclose, and this something is not associated with any handle like FILE*. For example, I can express the code to be executed inevitably, even if an exception occurs at some point, as a scope guard. void foo() { // some code here... BOOST_SCOPE_GUARD_BEGIN(whatever) { // This code is executed even if the function below // throws. This function may be out of this module's // scope, so I generally don't know (and don't care) // wether it does throw or not, and if it does, what // it does throw. } BOOST_SCOPE_GUARD_END; bar(); } Another good use case for scope guards is making rollbackable code. But I see, this implementation doesn't support that. -- Best regards, Andrey mailto:andysem@mail.ru