Will one be able to replace exceptions? A common C# scenario:<br><br>class SystemException : Exception<br>{<br>    this(string msg, Exception innerEx) { this(msg, innerEx); }<br>}<br><br>class SubsystemException : Exception<br>
{<br>     this(string msg) { this(msg); }<br>}<br><br>void system()<br>{<br>    try<br>    {<br>         subsystem();<br>    }<br>    catch (SubsystemException ex)<br>    {<br>        // subsystem exception is replaced with system exception and linked to the latter<br>
        throw new SystemException("a system exception", ex);<br>    }      <br>}<br><br>void subsystem()<br>{<br>    throw new SubsystemException("a subsystem exception");<br>}<br><br>void main()<br>{<br>
      try<br>      {<br>          system();<br>      }<br>      catch (SystemException ex)<br>      {<br>           // catch system exceptions and subsystem exceptions are available via innerException property<br>           writeln("system: ", ex, ", subsystem: ", ex.innerException);       <br>
      }    <br>}<br><br>As far as I understand, your scheme makes the above problematic.<br><br><div class="gmail_quote">On Wed, Jan 12, 2011 at 1:50 AM, Andrei Alexandrescu <span dir="ltr"><<a href="mailto:andrei@erdani.com">andrei@erdani.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">I don't think that's helpful. It complicates the flow a lot because now understanding how the program acts depends not on the types anymore, but on what happens dynamically. Makes it more difficult, not easier, to write robust code.<br>

<br>
If I throw a FileException, I must catch a FileException with catch(FileException) regardless of what collateral exceptions have happened.<br><font color="#888888">
<br>
<br>
Andrei</font><div><div></div><div class="h5"><br>
<br>
On 1/11/11 12:31 PM, Don Clugston wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
I've thought about this a bit more. Another simple rule is, that an<br>
exception chain can be caught if  and only if every exception in that<br>
chain can be caught.<br>
So, for example,<br>
catch(FileException) will catch multiple file exceptions.<br>
catch(Exception) will catch any exception (but not Errors).<br>
catch(Throwable) catches Errors as well.<br>
<br>
I went ahead and implemented this. Everythings seems to Just Work.<br>
Will check it in shortly.<br>
<br>
<br>
On 11 January 2011 18:30, Andrei Alexandrescu<<a href="mailto:andrei@erdani.com" target="_blank">andrei@erdani.com</a>>  wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Wow, this is incredible news!<br>
<br>
Thanks Don for working on this. Solid exception handling is a huge selling<br>
point for D.<br>
<br>
Regarding collateral throwables that are not Exception, good point (and I<br>
agree that the solution should be simple). TDPL doesn't discuss that issue,<br>
but it says that the initially-thrown exception is the "boss" and that<br>
everybody follows, so a possible design is to simply make the Throwable part<br>
of the chain.<br>
<br>
I'd want to have chained exceptions still catchable by catch (Exception)<br>
because it would be a first to have the contents of the data influence its<br>
type. As far as the type system is concerned, catch (Exception) should catch<br>
Exceptions, whether or not they have a tail.<br>
<br>
One possibility would be to move the Throwable to the front of the list.<br>
This also has its issues, for example the stack is unwound for a while and<br>
then not anymore (a Throwable is allowed to respect fewer rules than an<br>
Exception).<br>
<br>
Ideas please?<br>
<br>
<br>
Andrei<br>
<br>
On 1/11/11 1:57 AM, Don Clugston wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
I believe I have got TDPL exception chaining working correctly using<br>
Windows Structured Exception Handling.<br>
(This was far from easy!)<br>
Central to making chaining work correctly, is that chaining must only<br>
occur<br>
when a collision occurs (not merely when two exceptions are in flight,<br>
because one may be caught before it has any effect on the other). This<br>
means that multiple chains of exceptions<br>
may be in flight at any given time.<br>
My code works in all nasty corner cases I've tested, including<br>
multi-level collisions,<br>
where two exceptions collide in a function, then collide again with an<br>
even earlier exception chain in a finally block in a different function.<br>
<br>
So the general scheme appears to work.<br>
But, there's something I'm unclear about. When should chained<br>
exceptions be catchable?<br>
They are very nasty creatures, and you really want to know when they<br>
happen.<br>
Presumably, an AssertError which occurs while processing an<br>
FileException, should not be silently chained<br>
and caught in the FileException.<br>
In fact, should a chain containing an Error be catchable at all?<br>
(If not, it still has to at least be catchable in the catchall handler<br>
that wraps main()).<br>
Many other schemes are possible, but I think it's important that the<br>
rules remain simple.<br>
<br>
One simple solution would be to make chained exceptions only catchable<br>
by catch(Throwable).<br>
_______________________________________________<br>
phobos mailing list<br>
<a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a><br>
<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
</blockquote>
<br>
_______________________________________________<br>
phobos mailing list<br>
<a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a><br>
<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
<br>
</blockquote>
_______________________________________________<br>
phobos mailing list<br>
<a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a><br>
<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
</blockquote>
_______________________________________________<br>
phobos mailing list<br>
<a href="mailto:phobos@puremagic.com" target="_blank">phobos@puremagic.com</a><br>
<a href="http://lists.puremagic.com/mailman/listinfo/phobos" target="_blank">http://lists.puremagic.com/mailman/listinfo/phobos</a><br>
</div></div></blockquote></div><br>