在执行期间在Kohana v3中捕获Kohana_Request_Exception - 意外行为

时间:2010-12-05 00:36:12

标签: php kohana

详细信息如下:Need assistance with Kohana 3 and catch all route turning into a 404 error作为问题的接受答案,我试图捕捉Kohana抛出的错误,以显示漂亮的错误页面并发送正确的HTTP代码。

以下是演示此问题的简化版本:

try {
    // Instantiate your Request object
    $request = Request::instance();
    // The give it a try, to see if its a valid request
    $request->execute();
}
catch (Kohana_Request_Exception $e) {
    header('Content-Type: text/html; charset='.Kohana::$charset, TRUE, 404);
    echo Request::factory('err/404')->send_headers()->execute()->response;
    exit;
}
echo $request->send_headers()->response;

所以我导航到一个不存在的网址,例如http://example.local/moo/,我得到以下回复

Kohana_Request_Exception [ 0 ]: Unable to find a route to match the URI: moo

以下是正在发生的事情 - 请求正在尝试,失败时出现Kohana_Request_Exception,被捕获但是当我尝试构建新的请求对象时,Request::factory('err/404')该请求会抛出我第一次请求的错误....! WTF ??

我已经摆弄了一个小时,我感到困惑,就像我开始时一样。不应该来自工厂的新请求不知道旧请求?当我从d00d的答案中复制它时,为什么这段代码出现故障?

// Release version and codename
const VERSION  = '3.0.7';
const CODENAME = 'hattrick';

有人指出我正确的方向..那些人。

2 个答案:

答案 0 :(得分:0)

这是因为在Request::factory('err/404')内,err/404部分是一个尝试与您的路线匹配的网址。会不会匹配,即你有这样的路线......

Route::set('errors', 'err/<action>', array('action' => '404|500')) {}

您还应该通过...发送404

$request->status = 404;

答案 1 :(得分:0)

啊哈!谢谢大家,但我明白了..我应该仔细看看堆栈跟踪,错误页面的模板控制器的before()方法在尝试使用Request::instance()检查身份验证时抛出了新错误将其更改为Request::current()并且它都闪亮。

感谢您的帮助!