4

これが私のコードの一部です:

// ... code ...
$action = self::defineAction( $request->getPath() );
try {
    $response = Controller::$action( $request );
} catch( \BadMethodCallException $exception ) {
    Logger::logError( $exception );
    $response = new NotFoundResponse();
}
// ... code ...

誤って定義された名前のコントローラーのアクションが実装されていない場合、または名前が間違って定義されている場合は、例外をキャッチしようとします。

しかし、例外をキャッチする代わりに、Apacheのエラーログに致命的なエラーが表示されます。

PHP Fatal error:  Call to undefined method app\\Controller::testingAction() ...

コントローラの既存の(定義された呼び出し可能な)アクション内で未定義のメソッドを呼び出そうとすると、前述の例外をキャッチできません-代わりに致命的なエラーが発生します:

PHP Fatal error:  Call to undefined method app\\SomeClass::someUndefinedMethod() in /********/Controller.php on line *** ...

「\BadMethodCallException」を「\Exception」に置き換えても効果はありません。致命的なエラーが発生し続けます。

「try-catch」ブロックをコントローラーのすべてのアクション内に配置することは、私にとって許容できる解決策ではありません。

なぜこの方法で例外をキャッチできないのですか?どうすればこの問題を解決できますか?

PHP5.3.8を実行しています。

4

1 に答える 1

3

キャッチブロックは、スローされた例外のみをキャッチでき、エラーはキャッチできません。Call to undefined methodはエラーであり、これをテストして自分で例外をスローする必要があります。例外とエラーの違いについては、こちらをご覧ください。

次のようなことを行うことで、メソッドが存在するかどうかをテストできます。

if( !method_exists('app\Controller', 'testingAction') ) {
    throw new \BadMethodCallException();
}
于 2012-11-21T13:43:30.540 に答える