On Tuesday, 9 December 2014 at 17:06:45 UTC, Dmitry Olshansky wrote:
Then we could use interfaces as "tags" for exceptions and catch using one of many interfaces an exception has.

I think that is an excellent idea! I have looked a bit at boost::exception, and wanted for a while to incorporate something similar into DIP33. It has two important features:

Firstly, it allows semantic tagging of exceptions, which is implemented in C++ by means of multiple (virtual) inheritance. Your suggestion of using interfaces for this would fit the bill nicely, I think. For interfaces that have extra functions, we could supply standard implementations of those functions as mixin templates for when users don't want to implement those functions themselves.

Secondly, boost::exception allows for transport of arbitrary data to the catch site, and importantly, supplying additional data as the exception propagates up the call chain. (E.g., the lowest-level I/O function only has a file descriptor and can only provide an errno code, so the file name must be supplied at a higher level, e.g. in std.stdio.File. Furthermore, the file was opened in some context, e.g. "read image file", which may also be useful to know at the catch site.) I'm not sure what is the best way to achieve this in D, but one option is to use an (associative?) array of Variants.


Consider DIP33:
http://wiki.dlang.org/DIP33

The 2 problems it had were:

1. enums are hard to extend for std lib, and absolutely impossible by 3rd party libraries. 2. Single hierarchy has some appeal but it doesn't allow to catch on similar classes that do not inherit from the same base class. Basically there are many ways to view similarities of excpetions and single hierarchy fails to address that.

I consider (2) the biggest problem by far. The enum solution doesn't preclude extension by subclassing – in fact, that was the main purpose of the "unknown" constant in the "Kind" enums.

Lars

Reply via email to