DIP33: A standard exception hierarchy
monarch_dodra
monarchdodra at gmail.com
Mon Apr 1 04:52:46 PDT 2013
On Monday, 1 April 2013 at 11:33:57 UTC, Lars T. Kyllingstad
wrote:
> On Monday, 1 April 2013 at 11:23:50 UTC, monarch_dodra wrote:
>> On Monday, 1 April 2013 at 11:08:16 UTC, Lars T. Kyllingstad
>> wrote:
>>> It's time to clean up this mess.
>>>
>>> http://wiki.dlang.org/DIP33
>>
>> A quick comment about your "Error" section. You say:
>>
>> "In general, Errors should not be caught, primarily because
>> they indicate that the program logic is compromised, and that
>> the program may therefore be in an invalid state from which
>> there is no recovery".
>>
>> It is actually much worst than that: errors bypass the entire
>> exception handling mechanism, blasting through code that would
>> handle destructors, and even flying through functions that are
>> nothrow. They don't just indicate a "potential" invalid state,
>> they actually *put* the program in an invalid state, from
>> which there is no recovery.
>>
>> That is the main mechanical difference between an "error" and
>> an "exception", it is not just a philosophical "logic vs
>> runtime".
>
> I had forgotten about that. Personally, I think that is crazy.
> Errors ought to propagate just like Exceptions, they just
> shouldn't be a part of your "normal" error-handling mechanism.
I don't know, I find the approach kind of genius personally. If
it is a logic error, and your program is going to die, then why
pay for cleanup? You are getting the radical efficiency of a
normal assert, but with the opportunity to die like with an
exception.
The nicest part (IMO), is that thanks to this, you can assert in
a nothrow function, without violating its nothrow-ness (which we
do all over phobos, and even with built-in arrays).
>> --------
>>
>> Under this situation, I'm wondering how the "OutOfMemory" is
>> dealt with (you don't explain). The only logical explanation I
>> can see is:
>> - It is not an exception and is not caught by
>> "catch(Exception)".
>> - But it is not an error either, so does not corrupt the
>> program state.
>> => Goal: It is hard to catch, but you *can* recover from it.
>> Is this correct? Is this what we are going for?
>
> That was the idea, yes.
I like the idea, but it would be particularly breaking change for
nothrow functions though:
void foo() nothrow
{
try
{
throw new OutOfMemory()
}
catch (Exception /+e+/)
{}
}
"Error: foo is nothrow yet may throw"
...what ...? But I caught the Exception!
The bypass would be giving OutOfMemory the same semantics as an
Error, but then, it would just be an actual Error...
More information about the Digitalmars-d
mailing list