Nothrow functions
Janderson
ask at me.com
Thu Oct 2 08:04:10 PDT 2008
Andrei Alexandrescu wrote:
> Janderson wrote:
>> Andrei Alexandrescu wrote:
>>> dsimcha wrote:
>>>> == Quote from Janderson (ask at me.com)'s article
>>>>> Walter Bright wrote:
>>>> http://www.reddit.com/r/programming/comments/74fx4/nothrow_functions_in_the_d_programming_language/
>>>>
>>>>> Perhaps now constructors can enforce no-throw. Functions that have
>>>>> throw would have to be handled in that constructor. Of course we
>>>>> could
>>>>> always do this manually, but it might be worth considering making
>>>>> on by
>>>>> default for constructors.
>>>>> -Joel
>>>>
>>>> Please, please, please, please, *please* no!!! Anything that is in
>>>> any way
>>>> similar to checked exception Hell in Java does not belong in D.
>>>> Nothrow is a
>>>> great feature precisely because, by being a contract that is only
>>>> enforced when
>>>> the programmer explicitly asks for it to be, it can be simply
>>>> ignored in places
>>>> where one doesn't want to use it. Making nothrow the default in
>>>> constructors
>>>> really smacks of Java-style bondage and discipline, and a major
>>>> reason why I use D
>>>> is to avoid such things. If nothrow is the default *anywhere*, it
>>>> will lead to
>>>> aggravation and error swallowing similar to Java's checked exceptions.
>>>
>>> I agree. Bondage and discipline, heh :o). I'm actually surprised at
>>> the desire of making most constructors nothrow. Why?
>>>
>>> Andrei
>>
>> If an exception fires during the construction of an object and you
>> don't handle it your left with a partially formed object. It becomes
>> difficult to then make that object an invariant. This is particularly
>> bad when it occurs in the base classes constructor.
>
> But C++ solved this by making it impossible to obtain a
> partially-constructed object. If the constructor throws, there's never
> an object to talk about.
>
> Andrei
That's a good point, I guess the issue I've had in the past is with
resource handles and dangling pointers.
What if the object creates a handle to a resource in the constructor
just before the exception. That resource never gets cleaned up unless
your explicitly handle it with a try-catch. Other then the out of
memory one, I'm not aware of any C++ standard library that throw in the
constructor.
-Joel
More information about the Digitalmars-d
mailing list