2016-05-26 29 views
0

我正在Silex中创建应用程序。在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通过正确或我应该以另一种方式吗?

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

回答

1

OrderNotFoundException应该实现HttpExceptionInterface。在这种情况下可以延长NotFoundHttpException

use Symfony\Component\HttpKernel\NotFoundHttpException; 

class OrderNotFoundException extends NotFoundHttpException {} 

,只是抛出异常与

throw new OrderNotFoundException($message); 
+0

那么我的'MultipleOrderException'呢?我现在把它扔出来就像抛出新的OrderNotFoundException($ message,409);'所以我认为我应该做'类MultipleOrderExceptionextends ConflictHttpException {}'比? – MichaelDeBoey

+0

'OrderNotFoundException'暗示该异常仅适用于404代码。 (未找到)。如果你想使用其他的http状态,那么将其称为'OrderException'并扩展泛型[HttpException](https://github.com/symfony/http-kernel/blob/master/Exception/HttpException.php)类,或者添加这些http状态的新特定异常类 – Federkun

+0

好了,现在更清楚了,谢谢:-)我会带你和@ DarkBee的回答考虑:-) – MichaelDeBoey

1

恕我直言,你会做这种类似的更好:

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

}); 


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

}); 

//... 

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


}); 
+0

这正是我不认为这是一个好主意。 '因为那么你在每个错误函数中都几乎相同'$ messages ['message'] ='no_order_found';返回$ app ['twig'] - > render('home.twig',$ messages);' – MichaelDeBoey

+0

'function createMessage($ type)use($ app){ return $ app-> render('template.twig' ,['type'=> $ type,]); }'以防止重复的代码 – DarkBee

+0

这没有帮助,因为我总是需要说'$ type ='no_order_found'; createMessage($ type);'在每个错误函数中。这与_duplication_的数量相同,这是我在Switch Case中不知道的数量 – MichaelDeBoey