scope() and FileConduit (D1 and Tango)

Steven Schveighoffer schveiguy at yahoo.com
Sat Oct 4 11:18:46 PDT 2008


"Nick Sabalausky" wrote
> "Jarrett Billingsley" <jarrett.billingsley at gmail.com> wrote in message 
> news:mailman.4.1223071686.3520.digitalmars-d-learn at puremagic.com...
>> On Fri, Oct 3, 2008 at 4:57 PM, Nick Sabalausky <a at a.a> wrote:
>>> I'd like some clarification on the way scope() works, and also Tango's
>>> FileConduit. In the following function:
>>>
>>> void load(char[] infilename)
>>> {
>>>    auto file = new FileConduit(infilename);
>>>    scope(exit) file.close();
>>>
>>>    // Load data
>>> }
>>>
>>> What happens if infilename doesn't exist? Does FileConduit's constructor
>>> throw an exception? If so, file.close() isn't called, is it?
>>
>> Yes, the ctor throws an exception.  No, file.close is never called.
>> scope statements are only executed if execution reaches them
>> successfully.
>
> Thanks.
>
> A minor followup question (more of a curiosity, really): If .close() is 
> called on a conduit that is already closed, is this silently accepted or 
> is there a "Tried to close a non-open conduit" exception? And is that 
> behavior a defined part of the API, or just sort of "That's what it does 
> right now, but it's not officially guaranteed to do that"?

If you use FileConduit the way you are saying above, and the ctor throws an 
exception, then the variable is null, so you would get a null-pointer 
exception first.

> Also, it looks like neither FileConduit nor its base classes have a 
> destructor, which suggests to me I can't use RTTI and replace both lines 
> in the code sample above with "scope file = new FileConduit(infilename);". 
> Any particular reason for this, or is it a possible future enhancement?

I'll let my previous discussion with Kris speak to that issue:

http://www.dsource.org/projects/tango/forums/topic/260

-Steve 




More information about the Digitalmars-d-learn mailing list