我正在尝试添加自定义页面。我正在使用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';
也不喜欢那个解决方案。
答案 0 :(得分:1)
通过覆盖一种方法,你无法得到你想要的东西。下面我解释一下你可以覆盖的方法,以达到你想要的效果。只需确保您使用正确的方法输入正确的代码即可。
不要试图在一个地方做所有事情。虽然它将在一个地方,但很可能会变得一团糟。
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::_handler()返回一个Response对象,因此适合在Request_Client_External::execute_response(),Kohana_Exception::handler()和View::__toString()中调用。
HTTP_Exception::get_response(),但扩展HTTP_Exception_Expected的异常除外。扩展HTTP_Expected_Exception的异常的一些示例是3xx和401 HTTP_Exceptions。
默认情况下,它会返回Kohana_Exception::response()。 在特定异常中覆盖它以返回所述异常的特定响应。 如果要替换默认响应,请在HTTP_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,如何做到这一点非常不同。