【问题标题】:Silex: error handlers for specific exception typesSilex:特定异常类型的错误处理程序
【发布时间】:2012-03-23 14:56:54
【问题描述】:

Silex 是否可以根据抛出的异常使用错误处理程序?

我知道这可以通过一个异常处理程序和一个关于抛出异常的类名的 switch 语句来实现,但对我来说,“Silex 方式”似乎更干净,但不起作用。

这就是我希望它工作的方式

<?php
// Handle access denied errors
$app->error(function (\App\Rest\Exception\AccessDenied $e) {
    $message = $e->getMessage() ?: 'Access denied!';
    return new Response($message, 403);
});
// Handle Resource not found errors
$app->error(function (\App\Rest\Exception\ResourceNotFound $e) {
    $message = $e->getMessage() ?: 'Resource not found!';
    return new Response($message, 404);
});
// Handle other exception as 500 errors
$app->error(function (\Exception $e, $code) {
    return new Response($e->getMessage(), $code);
});

问题是当我在控制器中抛出 ResourceNotFound 异常时,会执行与 AccessDenied 相关的错误处理程序

可捕获的致命错误:传递给 {closure}() 的参数 1 必须是 App\Rest\Exception\AccessDenied 的实例,给出 App\Rest\Exception\ResourceNotFound 的实例

这是否可以通过其他方式实现,或者我应该将所有与通用异常一起使用的处理程序中的所有内容都填满并打开引发的异常类型?

PS:我知道$app-&gt;abort() 方法,但更喜欢处理异常

【问题讨论】:

    标签: exception silex


    【解决方案1】:

    编辑:这个功能现在已经进入了 Silex 核心!


    目前这是不可能的。现在,您必须要么有一个带有 switch 语句的处理程序,要么有多个带有 if ($e instanceof MyException) 的处理程序。

    我确实喜欢这个想法,并且应该可以通过使用反射来实现它。如果您能创建一个新票 on the tracker,或者如果您有兴趣,甚至可以开发一个补丁,那就太棒了。

    干杯!

    【讨论】:

    • 嗨,Igor,非常感谢,实际上我刚刚在邮件列表中提出了一个建议,请您检查并提供一些反馈,然后我会完成它并发送拉取请求。
    • 我已经更新了我的答案,因为这个功能现在在 silex 核心中可用。 :)
    【解决方案2】:

    我在项目中使用的另一种解决方案:

    class ProcessCallbackException extends Exception
    {
        public function __construct(\Closure $callback, $message = "", Exception $previous = null)
        {
            parent::__construct($message, 0, $previous);
            $this->callback = $callback;
        }
    
        public $callback;
    }
    
    class AccessDeniedException extends ProcessCallbackException
    {
        public function __construct($message = null)
        {
            $f = function() {
                return app()->redirect('/login');
            };
    
            parent::__construct($f, $message);
        }
    }
    
    # Handle your special errors
    $app->error(function (\Exception $e, $code) {
        if ($e instanceof ProcessCallbackException)
        {
            /** @var ProcessCallbackException $callbackException */
            $callbackException = $e;
            return call_user_func($callbackException->callback);
        }
        else
            return null;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 2011-07-02
      相关资源
      最近更新 更多