Out parameters and the strong exception guarantee

Justin Johansson no at spam.com
Wed Jun 9 07:18:24 PDT 2010


bearophile wrote:
> Michel Fortin:
> 
>> But if one of your function has an 'out' parameter, it's impossible to 
>> implement the strong guarantee, as illustrated by this trivial example:
>>
>> 	void testOut(out int a) {
>> 		throw new Exception("hello!");
>> 	}
>>
>> 	void main() {
>> 		int a = 2;
>> 		try
>> 			testOut(a);
>> 		finally
>> 			writeln(a);
>> 	}
>>
>> Prints:
>>
>> 	0
>> 	object.Exception: hello!
>>
>> This happens because the out parameter gets reset to its default value 
>> as soon as you enter the function, so you can't throw an exception 
>> before it has been changed.
>>
>> So should 'out' be reformed to behave more like a return value? I'm not 
>> sure. But I think this is something to keep in mind when using out 
>> parameters.
> 
> 
> In a recent post here:
> http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=110908
> and in some successive answers I have tried to explain that out arguments are a hack, they aren't as logically clean as multiple return values. I didn't think about exceptions too, your example adds one more case to what I was saying there. Thank you.
> 
> Bye,
> bearophile

I re-read that recent post of yours in the context of this new post and 
I must say that I agree with you.  The ability to return mutiple return 
values,  as a tuple of sorts, is a good idea.  Short of this a stronger 
type system with existential typing (cardinalities) would suffice.  Of 
course that might bring us into a discussion about nullable types which 
is which is which is which is which is a recursive topic on this ng.

Regards
Justin








More information about the Digitalmars-d mailing list