当前位置: 首页 > 文档资料 > FuelPHP 中文文档 >

错误处理 - 一般

优质
小牛编辑
132浏览
2023-12-01

简介

正如大家(应该)知道的,在开发过程中,错误处理 是非常重要的部分。它不仅向使用者表明他/她/它所请求的页面是不可用的, 也是一种透过提供一个 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