Sounds like the proposal currently stands to avoid the DiamondOfDeath or TriangleOfLove that multiple inheritance brings us.... and just have the base Exception class inherit std::exception and extend Exception class as appropriate within the library.
+1 and thanks for the code examples, very illistrative! +1 to Boost stack trace as well... On Thu, Sep 14, 2017 at 10:10 AM, Jacob Barrett <jbarr...@pivotal.io> wrote: > The problem stems from the fact that none of the std exceptions virtually > inherit from std::exception so you end up in the inheritance triangle of > love. I say we avoid the multiple inheritance issues with exceptions by > avoiding multiple inheritance altogether in exceptions. See this example. > http://coliru.stacked-crooked.com/a/2e32e7777b021e85 > > Basically all of our exceptions extend our Exception class which extends > std::exception. None extend any of the other std exceptions, like > bad_alloc, etc. The downside is you can't catch any std exception other > than std::exception but the upside is that this actually works. There were > also very few exceptions that actually could extend any std exceptions > beyond std::exception. > > -Jake > > > On Wed, Sep 13, 2017 at 10:52 PM Jacob Barrett <jbarr...@pivotal.io> > wrote: > > > Let me see if I can considerate the consensus here: > > > > As reasonably possible throw library specific exceptions from all public > > methods. > > > > As reasonably possible those exceptions should extend C++11 standard > > library exceptions. > > > > All exceptions should extend less specific but logically relevant base > > exceptions. > > > > A few quick examples: > > namespace apache { > > namespace geode { > > namespace client { > > > > class Exception : public std::exception {...}; > > > > class IllegalArgumentException : public Exception, public > > std::invalid_argument {...}; > > > > class TransactionException : public Exception {...}; > > > > class RollbackException : public TransactionException {...}; > > > > } > > } > > } > > > > Additionally, investigate using Boost Stack Track library for providing > > stack context in exceptions, otherwise dump the current stack tracing > > feature that is incomplete and very platform specific. > > > > Does anyone have a different understanding of the consensus? > > > > > > I found some problems with this model. The IllegalArgumentException would > > not be caught in a catch (const std::exception& e) statement do to > > multiple inheritance. Another nasty is std::exception doesn't have a > > constructor to populate the what() value. Some examples of this problem > > can be seen here: > > http://coliru.stacked-crooked.com/a/5b6e34c7ea020fc8 > > > > > > -Jake > > > > > > > > > > On Wed, Sep 13, 2017 at 4:37 PM Mark Hanson <mhan...@pivotal.io> wrote: > > > >> I think that it would be best to abide by using the std::exception as > the > >> base. I think it brings with it all the language support and > flexibility. > >> There are a few penalties obviously to using std::exception as a base, > but > >> I think they are sufficiently offset by using a standard. As far as the > >> number of exceptions, I believe in the philosophy of using as few as > >> possible and using inheritance to drive specificity. The benefit is that > >> the code can be as simple or as complex as it can be without unnecessary > >> overhead e.g error => network error => tcp error. So, I may just care > there > >> is a network error and the being able to tell if something derives from > >> network error is perfect. > >> > >> Thanks, > >> Mark > >> > >> > >> > On Sep 8, 2017, at 1:35 PM, Ernest Burghardt <eburgha...@pivotal.io> > >> wrote: > >> > > >> > if we continue the merging of Jake <> Sarge comments we might find > that > >> > std::exception(s) is sufficient if the many name exceptions that > >> pertain to > >> > the Library are all handled in a similar manner and only have unique > >> names > >> > for human readability, but not a functional consideration... > >> > > >> > EB > >> > > >> > On Fri, Sep 8, 2017 at 8:52 AM, Michael William Dodge < > >> mdo...@pivotal.io> > >> > wrote: > >> > > >> >> I subscribe to Josh Gray's philosophy of only having another > exception > >> >> class if there is something different to be done when it's caught. > For > >> >> example, if the caller would do the exact same thing for > >> >> NoPermissionsException and DiskFullException, just use an IOException > >> and > >> >> be done with it. I also subscribe to the philosophy that a library > >> have its > >> >> own exception hierarchy (possibly with a single class), which I think > >> >> meshes with Jake's "exceptions exiting a library to be reasonably > >> limited > >> >> to exceptions generated by and relating to that library". > >> >> > >> >> Sarge > >> >> > >> >>> On 8 Sep, 2017, at 07:19, Jacob Barrett <jbarr...@pivotal.io> > wrote: > >> >>> > >> >>> Sorry for jumping on this thread so late. This is an important issue > >> we > >> >>> need to address. > >> >>> > >> >>> On Thu, Aug 17, 2017 at 11:57 AM David Kimura <dkim...@pivotal.io> > >> >> wrote: > >> >>> > >> >>>> Using exceptions seems contrary to the Google C++ Style Guide we > >> >> adopted, > >> >>>> which states: *"do not use C++ exceptions"* [3 > >> >>>> <https://google.github.io/styleguide/cppguide.html#Exceptions>]. > >> Here > >> >> is > >> >>>> a > >> >>>> link [4 <https://www.youtube.com/watch?v=NOCElcMcFik#t=30m29s>] > to a > >> >>>> cppcon > >> >>>> talk defending their decision. Does it make sense to enforce this > >> rule > >> >> on > >> >>>> our code base? > >> >>>> > >> >>> > >> >>> I don't agree with this approach, as I always tend towards > >> >>> progress/modernization, but it was their choice to remain consistent > >> >> across > >> >>> their code base. I would say if we made the same decision solely on > >> >>> consistency then we would have our own exceptions derived from a > base > >> >>> exception class. This is consistent with our Java and .NET as well > as > >> >>> current C++ clients. > >> >>> > >> >>> > >> >>>> If we decide to knowingly ignore this rule, would we want to > >> continue to > >> >>>> propagate custom exceptions or switch to standard exceptions? At > the > >> >> very > >> >>>> least, it seems to me that our custom exceptions should derive from > >> >> their > >> >>>> most closely matching standard exception counterparts. Thoughts? > >> >>>> > >> >>> > >> >>> I agree with your recommendation of using our exceptions but extend > >> the > >> >>> most appropriate C++11 exceptions where applicable. I think it is > good > >> >> form > >> >>> for exceptions exiting a library to be reasonably limited to > >> exceptions > >> >>> generated by and relating to that library. > >> >>> > >> >>> Our current Exception class also brings with it stack tracing, > >> although > >> >>> poorly supported on some platforms and disabled by default. Boost > just > >> >>> recently graduated a stack track library that is supported on many > >> >>> compilers and platforms. It may be worth integrating into our > >> exceptions > >> >> as > >> >>> a replacement for the current stack tracing code. > >> >>> > >> >>> -Jake > >> >> > >> >> > >> > >> >