在 Silex 中捕获自定义异常未按预期工作

Catch custom Exception in Silex isn't working as expected

我正在 Silex 中申请。

我在代码中的某个地方做了 throw new OrderNotFoundException($message, 404);

所以我的 index.php 中的 $app->error 会捕捉到这个。 我已按如下方式实施:

$app->error( function ( \Exception $e, $code ) use ( $app ) {
    $messages = [ ];

    switch ($code) {
        case 401:
            $messages[ 'message' ] = 'unauthorized';
            break;
        case 404:
            if($e instanceof OrderNotFoundException){
                $messages[ 'message' ] = 'no_order_found';
            } else {
                $messages[ 'message' ] = 'page_not_found';
            }
            break;
        case 409:
            if($e instanceof MultipleOrderException){
                $messages[ 'message' ] = 'multiple_orders';
            }
            break;
        default:
            $messages[ 'message' ] = 'unknown_error';
    }

    return $app[ 'twig' ]->render( 'home.twig', $messages );
} );

但我一直收到 'unknown_error'
我抛出的异常 $code 是否正确传递,或者我应该以其他方式执行此操作?

为每个异常创建一个新的错误函数似乎不是我认为的好方法。

恕我直言,你最好这样做:

$app->error( function (OrderNotFoundException $e, $code ) use ( $app ) {

});


$app->error( function (MultipleOrderException $e, $code ) use ( $app ) {

});

//...

$app->error( function (Exception $e, $code ) use ( $app ) {


});

OrderNotFoundException 应该实施 HttpExceptionInterface。在这种情况下,您可以扩展 NotFoundHttpException:

use Symfony\Component\HttpKernel\NotFoundHttpException;

class OrderNotFoundException extends NotFoundHttpException {}

然后用

抛出异常
throw new OrderNotFoundException($message);