【发布时间】:2015-08-19 07:56:50
【问题描述】:
抱歉这个模糊的标题,我不知道如何命名我的问题。
我正在通过kernel.event_listener 服务收听kernel.exception。我在我的 API 中使用它来捕获所有异常并在 JSON 中将它们序列化,以便为 API 客户进行干净的错误处理。
我必须根据异常类型(我的 HTTP 异常、Symfony HTTP 异常等)调整序列化。
如果用户在访问 security.yml 中受access_control 限制的部分时未通过身份验证,Symfony 会抛出非 HTTP Symfony\Component\Security\Core\Exception\InsufficientAuthenticationException。在我的序列化程序中,非 HTTP 异常被转换为 500 错误。由于InsufficientAuthenticationException 是一个401 Unauthorized 错误,我必须单独捕获此异常并将其转换为我的应用程序特定的异常类型。
例子:
# Find appropriate serialization
if($ex instanceof HttpErr\HttpErrorInterface) {
# AppBundle\Exceptions\Http\*
# A displayable error thrown intentionally by our controllers
$status = $ex->getStatusCode();
$message = $ex->getMessage();
$other = $ex->getAdditionalDatas();
} elseif($ex instanceof InsufficientAuthenticationException) {
throw new HttpErr\EUnauthorized; # look a this line
}
# more elseifs...
这行得通。捕获 Symfony 认证异常,然后转换为 EUnauthorized,然后将 EUnauthorized 序列化为 JSON。但是你可以看到我抛出了没有消息的异常或previous 异常。
因为我想这样做:
elseif($ex instanceof InsufficientAuthenticationException) {
# the standard argument $previous is in 2nd position in my exceptions instead of being 3rd.
# the previous argument is important for me since it will keep context in error propagation.
throw new HttpErr\EUnauthorized($ex->getMessage(), $ex);
}
当我这样做时(因此,只需添加两个参数),序列化停止工作,我的事件侦听器没有被调用并且应用程序崩溃(在 prod 中,这将变成一个友好的 WSoD):
为什么?
【问题讨论】:
标签: php symfony exception-handling