如何在Zend中正确设置异常处理程序?

时间:2011-11-06 00:32:55

标签: php zend-framework error-handling

我正在尝试重新定义Zend(RESTful)中几个控制器的异常处理程序。

这是我的代码:

abstract class RestController extends Zend_Rest_Controller
{
    public function init()
    {
        set_exception_handler(array($this, 'fault'));
    }

    public function fault($exception = null, $code = null)
    {
       echo $exception->getMessage();
    }
}

但由于某些原因,Zend使用默认模板/错误处理,而我的fault函数没有执行。 顺便说一下,我正在使用module架构。该控制器来自rest模块.Zend的默认错误处理程序来自default模块。

2 个答案:

答案 0 :(得分:4)

这是一个有趣的问题。我现在还不完全确定,所以我要稍微研究一下,看看我想出了什么。目前,有一些解决方案也不是太多的贫民窟。一种方法是创建一个抽象控制器,从中扩展休息模块中的所有控制器。

abstract class RestAbstractController extends Zend_Rest_Controller
{
    final public function __call($methodName, $args)
    {
        throw new MyRestException("Method {$methodName} doesn't exist", 500);
    }
}

// the extends part here is optional
class MyRestException extends Zend_Rest_Exception
{
    public function fault($exception = null, $code = null)
    {
        echo $exception->getMessage() . ' ' . __CLASS__;
        exit;
    }
}

class RestController extends RestAbstractController
{
    // method list
}

另外,我发现了这篇有趣的文章:http://zend-framework-community.634137.n4.nabble.com/Dealing-with-uncatched-exceptions-and-using-set-exception-handler-in-Zend-Framework-td1566606.html

编辑:

你的bootstrap文件中的某个地方你需要添加:

$this->_front->throwExceptions(true);
$ex = new MyRestException();
set_exception_handler(array($ex, 'fault'));

第一行应该有效地关闭Zend的异常处理,唯一缺少的是用于确定当前请求是否适用于您的REST服务的控制结构。 注意这必须放在Bootstrap.php文件中的原因是你从未在init()函数中调用set_exception_handler(),因为Zend Framework首先抛出异常 。将其置于引导程序文件中将对抗该问题。

答案 1 :(得分:-1)

最后我自己解决了问题:)

来自Zend documentation

  

在Zend_Controller_Front :: throwExceptions()

     

通过将布尔值TRUE值传​​递给此方法,您可以告诉前面   控制器,而不是在响应中聚合异常   对象或使用错误处理程序插件,你宁愿处理它们   自己

所以,正确的解决方案是:

abstract class RestController extends Zend_Rest_Controller
{
    public function init()
    {
        $front = Zend_Controller_Front::getInstance();
        $front->throwExceptions(true);

        set_exception_handler(array($this, 'fault'));
    }

    public function fault($exception = null, $code = null)
    {
       echo $exception->getMessage();
    }
}

我们只需要添加

$front = Zend_Controller_Front::getInstance();
$front->throwExceptions(true);

set_exception_handler之前使其发挥作用。