错误处理 - 一般
简介
正如大家(应该)知道的,在开发过程中,错误处理 是非常重要的部分。它不仅向使用者表明他/她/它所请求的页面是不可用的, 也是一种透过提供一个 HTTP 错误状态来通知机器 (浏览器等)发生了什幺事情的方式。
程式码错误
FuelPHP 的内部错误处理是基于例外。这可以让你在你的程式码中捕捉它们, 因此你的应用程序可以优雅地处理发生的例外,且使用者可以继续使用应用程序。
FuelPHP 也改变预设 PHP 行为,当从旧的程序函式涉及 PHP 错误(不是例外)时。 取代在所有非致命错误继续的是,FuelPHP 将会在所有错误发生时抛出一个 PhpErrorException。 这将强迫你解决所有错误,即使过去你可能会忽略的一个 E_NOTICE。 它也能让你捕捉 PHP 错误。例如,当你有非程式设计师建立的检视, 要在检视档案捕捉语法错误时。
你可以透过添加 PHP 错误类型(像 E_NOTICE 或 E_STRICT)到你应用程序 config/config.php 档案中的 errors.continue_on 键来修改此行为。这里定义的错误将能让你的指令码继续。 这些错误的例外不会被抛出,所以你可以不再捕捉它们。
我们强烈建议在错误时别继续,因为它可能会导致程式码中的错误非常难以发现, 一旦你的应用程序进入量产!
应用程序逻辑错误
错误 404
404 路由设定在 app/config/routes.php 并且必须指向处理 404 页面的控制器/方法。 在路由章节阅读更多关于它的部分。
抛出一个 404
有些时候需要抛出一个 404 错误,像你自己处理路由时。 这可以透过抛出一个 HttpNotFoundException 来轻易办到。 一旦你运行 404 页面,Fuel 将 结束。
throw new HttpNotFoundException;
此例外在你应用程序的 index.php 档案被捕捉并且进行处理。被捕捉时, 它将寻找被定义的 404 路由,如果找到的话,它将锻造一个使用该路由做为 URI 给新请求。 由于这是一个正常的请求,URI 将像任何其他请求一样被路由!
如果你不希望这样的行为,变更你要读取的 index.php 档案。
// 产生请求、执行并发送输出。
try
{
$response = Request::forge()->execute()->response();
}
catch (HttpNotFoundException $e)
{
$route = array_key_exists('_404_', Router::$routes) ? Router::$routes['_404_']->translation : Config::get('routes._404_');
if ($route)
{
// 添加 'false' 到锻造的请求以停用路由引擎
$response = Request::forge($route, false)->execute()->response();
}
else
{
throw $e;
}
}
404 处理
当一个请求被建立,并在路由器寻找可能相符的却找不到相符合之后, 404 处理就进场了。预设情况下 _404_ 路径指向 welcome/404, 让我们看一下该方法:
// 在 Controller_Welcome 中
/**
* 应用程序的 404 动作。
*
* @access public
* @return void
*/
public function action_404()
{
$messages = array('Aw, crap!', 'Bloody Hell!', 'Uh Oh!', 'Nope, not here.', 'Huh?');
$data['title'] = $messages[array_rand($messages)];
// 设定一个 HTTP 404 输出表头
return Response::forge(Presenter::forge('welcome/404', $data), 404);
}
在这里,你可以看到 404 处理程序内部发生了什幺事。正如你可以看到它是一个正常的控制器动作。 关于这点好的地方是,它能让你在页面上显示任何你喜欢的内容。 你可以载入你自己的检视,带着从资料库取回的资料。
请注意 Fuel 不设定 404 状态,你的 Response 必须设定它。回传 Response::forge(Presenter::forge('welcome/404'), 404); 以传送正确的状态表头。
捕捉全部
由于 Fuel 不设定 404 回应状态,你可以使用它做为一个捕捉全部的函式。 你可能已经有一个可以透过 URI 从资料库取回页面的页面模型。 下面是一个例子来说明此可能性:
// 在你的 404 控制器中
public function action_my404()
{
$original_uri = \Input::uri();
$result = \DB::select()->from('pages')->where('uri', $original_uri)->execute();
if(count($result) === 1)
{
// 用任何你喜欢的方式显示该页面
}
else
{
// 显示你一般的 404 页
$messages = array('Aw, crap!', 'Bloody Hell!', 'Uh Oh!', 'Nope, not here.', 'Huh?');
$data['title'] = $messages[array_rand($messages)];
return Response::forge(View::forge('welcome/404', $data), 404);
}
}
抛出一个 500
可能有些时候你的应用程序需要简单地停止并显示一个错误, 来表明在伺服器上出了点问题。 通常这是一个 500 内部伺服器错误。
相似于抛出一个 404,可以抛出一个 500 错误。
throw new HttpServerErrorException;
在 CLI 模式中的错误
当在 CLI 模式中发生一个错误,无论是透过 oil 控制台互动,或执行一个任务时, 错误会简单呈现,并根据错误的类型,目前的动作可能会中止。
你可以启用倒出回溯跟蹤(backtrace)当致命错误发生时,透过设定在 config.php 配置档案中的 cli_backtrace
配置键为 true
。