scope() and FileConduit (D1 and Tango)

Bill Baxter wbaxter at gmail.com
Fri Oct 3 17:58:02 PDT 2008


On Sat, Oct 4, 2008 at 7:08 AM, Jarrett Billingsley
<jarrett.billingsley at gmail.com> wrote:
> 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.

Oh, ok I see what the issue is now.  I think this will do the right thing:

void load(char[] infilename)
{
   FileConduit file;
   scope(exit) { if (file) file.close(); }
   file = new FileConduit(infilename);
    // Load data
}

You could use "scope(success) file.close();" there instead, but that's
going to be wrong if an exception is thrown down in the "//Load data"
part.

--bb


More information about the Digitalmars-d-learn mailing list