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 <[email protected]> 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
>

Reply via email to