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