On 10/6/14, 9:55 AM, monarch_dodra wrote:
On Monday, 6 October 2014 at 14:54:21 UTC, Andrei Alexandrescu wrote:
On 10/6/14, 7:24 AM, monarch_dodra wrote:
If your "catch" throws an exception, then the new exception simply
"squashes" replaces the old one:
//----
catch (Exception e)
{
thisMightThrow(); //Lose "e" here
throw e;
}
//----
That's code under library/user control, I'm talking about the
responsibility of the language. -- Andrei
Right. but if correct usage is so cumbersome no one does it right, then
it is 's/the responsibility/a flaw/' of the language.
Are we advocating then that code under user control should
systematically look like this?
catch (Exception e)
{
try
{
thisMightThrow(); //Lose "e" here
}
catch(Exception ee)
{
findLast(e).next = ee; //because e.next might
}
throw e;
}
Only if it needs to save that information. As far as the core language
is concerned, once an exception has been caught and made available to
the user, it's up to the user what to do with it. The point of chaining
is to not render information inaccessible to user no matter what they
do. This is a fairly basic remark.
Honestly, a good middle ground is to ditch chaining, but allow multiple
exceptions thrown at once. Subsequent Exceptions/Errors will just be
lost (sorry), with the exception that an Error will override an Exception.
If I redesigned D's exceptions, I'd change a bunch of stuff before that.
For the sake of argument, do you have any examples where a program has
used chaining?
Whenever an exception is converted to a string, the chained exceptions
should be part of it too.
Andrei