On May 30, 2012, at 8:05 AM, "Steven Schveighoffer" <schvei...@yahoo.com> wrote:

> On Wed, 30 May 2012 05:32:00 -0400, Don Clugston <d...@nospam.com> wrote:
> 
>> On 30/05/12 10:40, Jonathan M Davis wrote:
>>> On Wednesday, May 30, 2012 10:26:36 deadalnix wrote:
>>>> The fact that error don't trigger scope and everything is nonsensial.
>>> 
>>> If an Error is truly unrecoverable (as they're generally supposed to be), 
>>> then
>>> what does it matter? Something fatal occured in your program, so it
>>> terminates. Because it's an Error, you can get a stack trace and report
>>> something before the program actually terminates, but continuing execution
>>> after an Error is considered to be truly _bad_ idea, so in general, why does
>>> it matter whether scope statements, finally blocks, or destructors get
>>> executed? It's only rarer cases where you're trying to do something like
>>> create a unit test framework on top of assert that you would need to catch 
>>> an
>>> Error, and that's questionable enough as it is. In normal program execution,
>>> an error is fatal, so cleanup is irrelevant and even potentially dangerous,
>>> because your program is already in an invalid state.
>> 
>> That's true for things like segfaults, but in the case of an AssertError, 
>> there's no reason to believe that cleanup would cause any damage.
> 
> There's also no reason to assume that orderly cleanup *doesn't* cause any 
> damage.  In fact, it's not reasonable to assume *anything*.
> 
> Which is the point.  If you want to recover from an error, you have to do it 
> manually.  It should be doable, but the default handling should not need to 
> be defined (i.e. implementations should be free to do whatever they want).
> 
> But there is no reasonable *default* for handling an error that the runtime 
> can assume.
> 
> I'd classify errors/exceptions into three categories:
> 
> 1. corruption/segfault -- not recoverable under any reasonable circumstances. 
>  Special cases exist (such as a custom paging mechanism).
> 2. program invariant errors (i.e. assert errors) --  Recovery is not defined 
> by the runtime, so you must do it manually.  Any decision the runtime makes 
> will be arbitrary, and could be wrong.
> 3. try/catch exceptions -- these are planned for and *expected* to occur 
> because the program cannot control it's environment.  e.g. EOF when none was 
> expected.
> 
> The largest problem with the difference between 2 and 3 is the actual 
> decision of whether an exceptional case is categorized as 2 or 3 can be 
> decoupled from the code that decides between them.
> 
> For example:
> 
> double invert(double x)
> {
>   assertOrEnfoce?(x != 0); // which should it be?
>   return 1.0/x;
> }
> 
> case 1:
> 
> void main()
> {
>    writeln(invert(0)); // clearly a program error
> }
> 
> case 2:
> 
> int main(string[] args)
> {
>   writeln(invert(to!double(args[1])); // clearly a catchable error
> }
> 
> I don't know of a good way to solve that...

Sounds like a good argument for the assert handler in core.runtime. 

Reply via email to