[phobos] Exception chaining

Sean Kelly sean at invisibleduck.org
Wed Jan 12 07:00:09 PST 2011


I think scope(failure) may need some work though, since it's modeled as a catch block. 

Sent from my iPhone

On Jan 12, 2011, at 12:46 AM, Don Clugston <dclugston at googlemail.com> wrote:

> No, that's unaffected by the scheme. The scheme only affects
> situations when an exception is thrown from inside a finally clause,
> when the finally clause is being executed because an exception had
> been thrown. It doesn't affect catch clauses, because once you're
> inside the catch, the first exception is no longer in flight.
> 
> 
> On 12 January 2011 09:27, Max Samukha <maxsamukha at gmail.com> wrote:
>> Will one be able to replace exceptions? A common C# scenario:
>> 
>> class SystemException : Exception
>> {
>>     this(string msg, Exception innerEx) { this(msg, innerEx); }
>> }
>> 
>> class SubsystemException : Exception
>> {
>>      this(string msg) { this(msg); }
>> }
>> 
>> void system()
>> {
>>     try
>>     {
>>          subsystem();
>>     }
>>     catch (SubsystemException ex)
>>     {
>>         // subsystem exception is replaced with system exception and linked
>> to the latter
>>         throw new SystemException("a system exception", ex);
>>     }
>> }
>> 
>> void subsystem()
>> {
>>     throw new SubsystemException("a subsystem exception");
>> }
>> 
>> void main()
>> {
>>       try
>>       {
>>           system();
>>       }
>>       catch (SystemException ex)
>>       {
>>            // catch system exceptions and subsystem exceptions are available
>> via innerException property
>>            writeln("system: ", ex, ", subsystem: ", ex.innerException);
>> 
>>       }
>> }
>> 
>> As far as I understand, your scheme makes the above problematic.
>> 
>> On Wed, Jan 12, 2011 at 1:50 AM, Andrei Alexandrescu <andrei at erdani.com>
>> wrote:
>>> 
>>> 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.
>>> 
>>> If I throw a FileException, I must catch a FileException with
>>> catch(FileException) regardless of what collateral exceptions have happened.
>>> 
>>> 
>>> Andrei
>>> 
>>> On 1/11/11 12:31 PM, Don Clugston wrote:
>>>> 
>>>> I've thought about this a bit more. Another simple rule is, that an
>>>> exception chain can be caught if  and only if every exception in that
>>>> chain can be caught.
>>>> So, for example,
>>>> catch(FileException) will catch multiple file exceptions.
>>>> catch(Exception) will catch any exception (but not Errors).
>>>> catch(Throwable) catches Errors as well.
>>>> 
>>>> I went ahead and implemented this. Everythings seems to Just Work.
>>>> Will check it in shortly.
>>>> 
>>>> 
>>>> On 11 January 2011 18:30, Andrei Alexandrescu<andrei at erdani.com>  wrote:
>>>>> 
>>>>> Wow, this is incredible news!
>>>>> 
>>>>> Thanks Don for working on this. Solid exception handling is a huge
>>>>> selling
>>>>> point for D.
>>>>> 
>>>>> Regarding collateral throwables that are not Exception, good point (and
>>>>> I
>>>>> agree that the solution should be simple). TDPL doesn't discuss that
>>>>> issue,
>>>>> but it says that the initially-thrown exception is the "boss" and that
>>>>> everybody follows, so a possible design is to simply make the Throwable
>>>>> part
>>>>> of the chain.
>>>>> 
>>>>> I'd want to have chained exceptions still catchable by catch (Exception)
>>>>> because it would be a first to have the contents of the data influence
>>>>> its
>>>>> type. As far as the type system is concerned, catch (Exception) should
>>>>> catch
>>>>> Exceptions, whether or not they have a tail.
>>>>> 
>>>>> One possibility would be to move the Throwable to the front of the list.
>>>>> This also has its issues, for example the stack is unwound for a while
>>>>> and
>>>>> then not anymore (a Throwable is allowed to respect fewer rules than an
>>>>> Exception).
>>>>> 
>>>>> Ideas please?
>>>>> 
>>>>> 
>>>>> Andrei
>>>>> 
>>>>> On 1/11/11 1:57 AM, Don Clugston wrote:
>>>>>> 
>>>>>> I believe I have got TDPL exception chaining working correctly using
>>>>>> Windows Structured Exception Handling.
>>>>>> (This was far from easy!)
>>>>>> Central to making chaining work correctly, is that chaining must only
>>>>>> occur
>>>>>> when a collision occurs (not merely when two exceptions are in flight,
>>>>>> because one may be caught before it has any effect on the other). This
>>>>>> means that multiple chains of exceptions
>>>>>> may be in flight at any given time.
>>>>>> My code works in all nasty corner cases I've tested, including
>>>>>> multi-level collisions,
>>>>>> where two exceptions collide in a function, then collide again with an
>>>>>> even earlier exception chain in a finally block in a different
>>>>>> function.
>>>>>> 
>>>>>> So the general scheme appears to work.
>>>>>> But, there's something I'm unclear about. When should chained
>>>>>> exceptions be catchable?
>>>>>> They are very nasty creatures, and you really want to know when they
>>>>>> happen.
>>>>>> Presumably, an AssertError which occurs while processing an
>>>>>> FileException, should not be silently chained
>>>>>> and caught in the FileException.
>>>>>> In fact, should a chain containing an Error be catchable at all?
>>>>>> (If not, it still has to at least be catchable in the catchall handler
>>>>>> that wraps main()).
>>>>>> Many other schemes are possible, but I think it's important that the
>>>>>> rules remain simple.
>>>>>> 
>>>>>> One simple solution would be to make chained exceptions only catchable
>>>>>> by catch(Throwable).
>>>>>> _______________________________________________
>>>>>> phobos mailing list
>>>>>> phobos at puremagic.com
>>>>>> http://lists.puremagic.com/mailman/listinfo/phobos
>>>>> 
>>>>> _______________________________________________
>>>>> phobos mailing list
>>>>> phobos at puremagic.com
>>>>> http://lists.puremagic.com/mailman/listinfo/phobos
>>>>> 
>>>> _______________________________________________
>>>> phobos mailing list
>>>> phobos at puremagic.com
>>>> http://lists.puremagic.com/mailman/listinfo/phobos
>>> 
>>> _______________________________________________
>>> phobos mailing list
>>> phobos at puremagic.com
>>> http://lists.puremagic.com/mailman/listinfo/phobos
>> 
>> 
>> _______________________________________________
>> phobos mailing list
>> phobos at puremagic.com
>> http://lists.puremagic.com/mailman/listinfo/phobos
>> 
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos


More information about the phobos mailing list