Perfect, thank you! :) Marco Pivetta
http://twitter.com/Ocramius http://ocramius.github.com/ On 30 March 2013 18:54, Chris Toomey <ctoo...@gmail.com> wrote: > Yep: https://github.com/zendframework/zf2/issues/4113 . I couldn't > figure out how to add the Di label to it. > > Chris > > > On Sat, Mar 30, 2013 at 6:39 AM, Marco Pivetta <ocram...@gmail.com> wrote: > >> Did you actually open a new issue for this one? Can't find it... >> On 26 Mar 2013 07:11, "Chris Toomey" <ctoo...@gmail.com> wrote: >> >>> Ok, will do. >>> >>> I looked at where to put the try/catch earlier and figure that the try >>> block should start just before line 686 and end just after line 695, which >>> would encompass the code where Di::$currentDependencies is manipulated. >>> The catch block would then reset Di::$currentDependencies to array() and >>> then re-throw the exception, so on entry the next time >>> Di::$currentDependencies would be clean. >>> >>> Chris >>> >>> On Mon, Mar 25, 2013 at 8:33 PM, Marco Pivetta <ocram...@gmail.com>wrote: >>> >>>> Hi Chris, >>>> >>>> Can you please report this on the issue tracker at >>>> https://github.com/zendframework/zf2/issues ? >>>> >>>> Anyway, where should the try-catch be placed? Because there's a lot of >>>> entry points that could cause this as far as I know. >>>> >>>> Marco Pivetta >>>> >>>> http://twitter.com/Ocramius >>>> >>>> http://ocramius.github.com/ >>>> >>>> >>>> On 26 March 2013 03:31, Chris Toomey <ctoo...@gmail.com> wrote: >>>> >>>>> We're seeing occasional CircularDependencyExceptions being reported >>>>> when >>>>> using Dependency Injection. By spurious I mean that 1 out of every say >>>>> 10,000 requests to get() an instance of a given class will fail with >>>>> that >>>>> exception being thrown, while the rest of them will work fine. >>>>> >>>>> I dug into the code today to see how that could happen, and found that >>>>> it's >>>>> triggered by 1) using the DI container to get an instance of some >>>>> class C, >>>>> during which in one of the recursive calls to Di->get() or >>>>> Di->newInstance() some dependent class D's instantiator throws an >>>>> exception, and 2) doing a subsequent Di->get() for D, C, or any other >>>>> class >>>>> that depends on D. >>>>> >>>>> The cause is that in case of (1), proper cleanup is not done on the >>>>> Di::$currentDependencies variable when an exception is thrown, and thus >>>>> it's left in an unclean state (with some dependencies vs. empty), so >>>>> that >>>>> during (2), Di->resolveMethodParameters() spuriously thinks there's a >>>>> circular dependency. >>>>> >>>>> The fix would be to put a try/catch block around the code that >>>>> pushes/pops >>>>> Di::$currentDependencies and does recursive calls, and in the catch >>>>> block >>>>> reset Di::$currentDependencies before re-throwing the exception. Maybe >>>>> there's other cleanup that should be done there too, but this is the >>>>> one >>>>> we've been bitten by. >>>>> >>>>> thx, >>>>> Chris >>>>> >>>> >>>> >>> >