3

次のコードがあります。

function doSomething()
{
     try {
         doSomeNastyStuff() // throws Exception
     } catch(\Exception $e) {
         if ($this->errorHandler) {
             call_user_func($e);
         } else {
             throw($e);
         }
     }
}

ただし、catch ブロックは機能しません。スタック トレースは、行でエラーが発生したことを示していますdoSomeNastyStuff()。問題はどこだ?

4

1 に答える 1

5

問題は、例外を再スローしていることです。スタック トレースはExceptionインスタンスの一部であり、例外が作成された時点で記録されます。次の方法でスタック トレースを取得できます。

 $e->getTrace(); // Exception $e

コードで例外を再スローすると、まだ古いスタック トレースが記録されており、これがフレームワークをだまして表示させます。例外は実際にその行で発生し、動作していないdoSomeNastyStuff()ように見えます。catch

したがって、次の方法で例外を再スローすることをお勧めします。

/** instead of throw($e) do */
throw new \Exception("Unhandled exception", 1, $e);

php5.3 から、まさにこの目的のために、Exception constructorオプションの 3 番目のパラメーターがあります。$previousその後、前のものExceptionを使用して取得できます$e->getPrevious();

于 2012-07-27T08:08:24.940 に答える