0

我正在尝试添加我的自定义页面。我正在使用 Kohana 3.3。官方文档指出我应该覆盖本handerKohana_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会被抛出和捕获。

不过,运行时错误没有问题。该块捕获它们并显式调用覆盖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';

也不喜欢那个解决方案。

4

1 回答 1

1

这篇文章中所有指向 Kohana 文档的链接都是针对 3.3 版的

只覆盖一种方法不会得到你想要的。下面我解释了您可以覆盖以实现您想要的方法。只要确保您将正确的代码放在正确的方法中即可。

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


Kohana_Exception::handler()

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

对于生产:记录原始异常。由于此场景与HTTP 状态代码 500(内部服务器错误)的描述相匹配, Kohana_Exception::handler() 应该显示 500 错误页面。

在开发过程中,您可能想要调用parent::handler().

Kohana_Exception::_handler()

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

HTTP_Exception::get_response()

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

默认情况下它返回Kohana_Exception::response()。在特定异常中覆盖它以返回针对所述异常的特定响应。当您想要替换默认响应时,在 HTTP_Exception 中覆盖它。

Kohana_Exception::response()

Kohana_Exception::response()负责收集渲染 Kohana_Exception::$error_view 模板所需的数据。可以在用户指南的kohana/errors 页面上看到输出示例。

当您想要相同数据的不同布局时,更改 Kohana_Exception::$error_view。覆盖 Kohana_Exception::response() 以替换整个事物。

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

于 2013-11-15T09:21:01.520 回答