Nothrow functions
Fawzi Mohamed
fmohamed at mac.com
Thu Oct 2 10:50:57 PDT 2008
I have the impression this whole argument comes from the need to
sidestep bugs in C++ compilers when releasing the memory of partially
constructed objects one gets when an exception is thrown by the
constructor.
D has a garbage collector, this cleanly sidesteps the whole problem, so
there is no reason to have nothrow in constructors.
Fawzi
On 2008-10-02 17:27:50 +0200, Janderson <ask at me.com> said:
> Andrei Alexandrescu wrote:
>> Janderson wrote:
>>> 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.
>>
>> Either you encapsulate the resource itself in its own object, or you
>> use try/catch like in any other function. It's a solved problem.
>
> Maybe there should be some sort of way to detect handles that are not
> RAII handled in the constructor? You have to handle these anyway
> right ?
>
>>
>>> Other then the out of memory one, I'm not aware of any C++ standard
>>> library that throw in the constructor.
>>
>> Many STL container constructors throw whatever exceptions the held
>> type's various constructors throw. Besides, why would you consider out
>> of memory errors somehow different?
>
> I guess that just about every function is a candidate for out of memory
> exceptions. You can handle it of course at the base of the program
> however to make some exception safe you'd alway have to handle the
> memory condition which is way to tedious, particularly when you might
> already know how much memory is available.
>
>>
>>
>> Andrei
More information about the Digitalmars-d
mailing list