That is a stellar response Dan, Thanks for being so clear. I had a feeling that this might be the case so we'll have to work around it.
Just for clarity and posterity I provided the simplest test case in the original email not the actual problem. In Drupal this isn't just one place though becase, we have a library(and by library I mean class) for parsing information out of exceptions. So we would have to do quite a bit more hackery then that to to keep type hinting. On Tue, Mar 31, 2015 at 8:59 PM, Dan Ackroyd <dan...@basereality.com> wrote: > Hi James, > > On 31 March 2015 at 21:51, James Gilliland <neclim...@gmail.com> wrote: > > By design, \EngineException does not extend \Exception so code doesn't > > accidentally catch this special type of exception. ... > > > > I don't know if this is all acceptable and/or by design but it is awkward > > so I wanted to bring it to the list to discuss. > > > Let me try to explain why the BC break at the top level is the right > choice. > > The change in the Exception hierarchy has to cause a BC break to exist > 'somewhere', as errors in code that were previously not throwing an > exception, but in effect just doing exit() are now throwing an > exception. This is a change in behaviour that cannot be handled > without some sort of BC break. > > There are two types of places where \Exception are currently being caught: > > i) in the middle of applications where some library is being called > where all exceptions need to be caught and changed to a more specific > exception. > > function foo() { > try { > someOtherLibrary(); > } > catch (\Exception $e) { > throw new OtherLibraryException( > $e->getMessage(), > $e->getCode, > $e > ); > } > } > > > ii) At the top level of the application where all exceptions are being > caught, so that they can be logged and a more graceful error message > than a stack trace can be shown to the user. > > If the BC break was for (i) by making all of the new exceptions be > under the hierarchy of \Exception, it would result in a lot of BC > break spread out across applications. > > Having the BC break in (ii) is pretty strongly preferable; it means > that there are just a few (or one), easy to find places in an > application where the code now needs to be changed from catching > \Exception to catching \BaseException (or whatever it will be after > the exception tidy up). > > Drupal (or any other application) can handle this BC break reasonably > easily by either dropping the type from the parameter of > _default_exception_handler or by adding a version check around it's > declaration like: > > if (PHP_VERSION_ID >= 700000) { > function _default_exception_handler(\BaseException $e) { > } > } > else { > function _default_exception_handler(\Exception $e) { > } > } > > Yeah, this isn't the most awesome thing ever to have to do, but imo it > sure beats having to change code in the middle of applications. > > cheers > Dan >