Thanks, Don. Looks like I completely missed the point of the discussion.<br><br><div class="gmail_quote">On Wed, Jan 12, 2011 at 10:46 AM, Don Clugston <span dir="ltr"><<a href="mailto:dclugston@googlemail.com">dclugston@googlemail.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;">No, that's unaffected by the scheme. The scheme only affects<br>
situations when an exception is thrown from inside a finally clause,<br>
when the finally clause is being executed because an exception had<br>
been thrown. It doesn't affect catch clauses, because once you're<br>
inside the catch, the first exception is no longer in flight.<br>
<div><div></div><div class="h5"><br>
<br>
On 12 January 2011 09:27, Max Samukha <<a href="mailto:maxsamukha@gmail.com">maxsamukha@gmail.com</a>> wrote:<br>
> 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<br>
> 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<br>
> via innerException property<br>
>            writeln("system: ", ex, ", subsystem: ", ex.innerException);<br>
><br>
>       }<br>
> }<br>
><br>
> As far as I understand, your scheme makes the above problematic.<br>
><br>
> On Wed, Jan 12, 2011 at 1:50 AM, Andrei Alexandrescu <<a href="mailto:andrei@erdani.com">andrei@erdani.com</a>><br>
> wrote:<br>
>><br>
>> I don't think that's helpful. It complicates the flow a lot because now<br>
>> understanding how the program acts depends not on the types anymore, but on<br>
>> what happens dynamically. Makes it more difficult, not easier, to write<br>
>> robust code.<br>
>><br>
>> If I throw a FileException, I must catch a FileException with<br>
>> catch(FileException) regardless of what collateral exceptions have happened.<br>
>><br>
>><br>
>> Andrei<br>
>><br>
>> On 1/11/11 12:31 PM, Don Clugston wrote:<br>
>>><br>
>>> 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">andrei@erdani.com</a>>  wrote:<br>
>>>><br>
>>>> Wow, this is incredible news!<br>
>>>><br>
>>>> Thanks Don for working on this. Solid exception handling is a huge<br>
>>>> selling<br>
>>>> point for D.<br>
>>>><br>
>>>> Regarding collateral throwables that are not Exception, good point (and<br>
>>>> I<br>
>>>> agree that the solution should be simple). TDPL doesn't discuss that<br>
>>>> 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<br>
>>>> 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<br>
>>>> its<br>
>>>> type. As far as the type system is concerned, catch (Exception) should<br>
>>>> 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<br>
>>>> 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>
>>>>><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<br>
>>>>> 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">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>
>>>> _______________________________________________<br>
>>>> phobos mailing list<br>
>>>> <a href="mailto:phobos@puremagic.com">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>
>>> _______________________________________________<br>
>>> phobos mailing list<br>
>>> <a href="mailto:phobos@puremagic.com">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>
>> _______________________________________________<br>
>> phobos mailing list<br>
>> <a href="mailto:phobos@puremagic.com">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>
><br>
> _______________________________________________<br>
> phobos mailing list<br>
> <a href="mailto:phobos@puremagic.com">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>
_______________________________________________<br>
phobos mailing list<br>
<a href="mailto:phobos@puremagic.com">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>