自定义错误页面 - 无法进入处理程序

时间:2013-11-14 07:25:13

标签: php kohana-3.3

我正在尝试添加自定义页面。我正在使用Kohana 3.3。官方文档指出我应该使用本地hander类的方法Kohana_Exception。这很容易做到,所以我做到了。现在我期待Kohana每次发生异常或错误时都会调用该方法。但这种情况并非如此。我找到了2个catch块,其中execute_request类的Kohana_Request_Client_Internal方法中捕获到异常。

第一次抓住

catch (HTTP_Exception $e)
{
    // Get the response via the Exception
    $response = $e->get_response();
}

第二次抓住

catch (Exception $e)
{
    // Generate an appropriate Response object
    $response = Kohana_Exception::_handler($e);
}

正如您所看到的,我没有覆盖任何catch块调用handler方法。

设置自己的异常处理程序set_exception_handler没有任何效果,因为它仅应用于未捕获的异常,并且抛出并捕获404之类的异常。

但运行时错误没有问题。该块捕获它们并显式调用overriden handler方法。

if (Kohana::$errors AND $error = error_get_last() AND in_array($error['type'], 

    Kohana::$shutdown_errors))
    {
        // Clean the output buffer
        ob_get_level() AND ob_clean();

        // Fake an exception for nice debugging
        Kohana_Exception::handler(new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line']));

        // Shutdown now to avoid a "death loop"
        exit(1);
    }

所以我的问题是如何设置所有内容以获得Exception和HTTP_Exception的自定义错误页面?

PS。我可以使用HTTP_Exception_404和HTTP_Exception_500来显示我的自定义错误页面,但我不认为这是最好的选择,因为它可以适用于这两个,但是覆盖所有可能的HTTP_Exceptions不是一个好方法。

PS2。或者我可以在bootstrap.php中设置自定义视图:

Kohana_Exception::$error_view = 'custom_error.tpl';

也不喜欢那个解决方案。

1 个答案:

答案 0 :(得分:1)

此帖子中Kohana文档的所有链接均适用于版本3.3

通过覆盖一种方法,你无法得到你想要的东西。下面我解释一下你可以覆盖的方法,以达到你想要的效果。只需确保您使用正确的方法输入正确的代码即可。

不要试图在一个地方做所有事情。虽然它将在一个地方,但很可能会变得一团糟。


Kohana_Exception ::处理程序()

Kohana_Exception::handler()用于异常到达异常处理程序或您在关闭处理程序中显示的情况。您必须在生产环境中显示一个漂亮的错误页面的最后机会。它输出Kohana_exception::_handler()的结果,它是一个Response对象,因此不适合在Request_Client_Internal::execute_response()内调用。

对于生产:记录原始异常。由于此场景与HTTP Status Code 500 (Internal Server Error) Kohana_Exception :: handler()的描述匹配,因此应显示500错误页面。

在开发过程中,您可能想要致电parent::handler()

Kohana_Exception :: _处理程序()

Kohana_Exception::_handler()返回一个Response对象,因此适合在Request_Client_External::execute_response()Kohana_Exception::handler()View::__toString()中调用。

HTTP_Exception :: get_response()

对于扩展HTTP_Exception的异常,将调用

HTTP_Exception::get_response(),但扩展HTTP_Exception_Expected的异常除外。扩展HTTP_Expected_Exception的异常的一些示例是3xx和401 HTTP_Exceptions。

默认情况下,它会返回Kohana_Exception::response()。 在特定异常中覆盖它以返回所述异常的特定响应。 如果要替换默认响应,请在HTTP_Exception中覆盖它。

Kohana_Exception ::响应()

Kohana_Exception::response()负责收集呈现Kohana_Exception :: $ error_view模板所需的数据。可以在kohana/errors page of the userguide上看到输出示例。

如果您想为同一数据设置不同的布局,请更改Kohana_Exception :: $ error_view。 覆盖Kohana_Exception :: response()来替换整个事物。

PS。凯文向你指出3.2文档。对于3.2和3.3,如何做到这一点非常不同。