0

为了在我的站点中建立一个良好的错误处理系统,我花了几天的时间。

我的错误处理系统只关注意外错误,例如 mysqli 错误

我的站点运行许多 mysqli 查询,这意味着可能会发生错误。

我的系统有 3 个部分,每个部分我都不确定它在最佳实践和效率中的位置。

第 1 步捕捉错误

$query = "
SELECT * FROM `users_account_activations` WHERE `user_ip` =?
";
$statement = $databaseHandler->mysqli->prepare($query);
$statement->bind_param('s', $userIp);
$statement->execute();
$statement->store_result();
//record error, if any
$databaseHandler->mysqli->error ? error = true : error = false; 
  • 这是在准备好的语句中捕捉错误的好方法吗?

  • 在准备阶段会不会在查询结束时查找错误而不是捕获错误?或者当准备阶段失败时,所有其他失败(比如倒下的多米诺骨牌)

第二步记录错误

error_log("Could not process query...", 3, 'log/default.log'); 
  • 这是记录错误的合适方式吗?与打开文件蒸汽的系统有关吗?

第 3 步处理数学后

既然出现了错误,我需要决定如何继续前进,我的系统将退出脚本并进入一个标准错误页面,上面写着“opps!出了点问题”。

header('location: errorpage.php'); exit();
  • 更改标题是这样做的好方法吗?我知道关于何时可以使用标题的限制。

有没有更好的方法来处理错误,这个系统是为意外错误设计的。预期的错误会得到处理并以不同的方式显示给用户。

4

1 回答 1

1

是的,你的怀疑是对的——所有三个步骤都是错误的。

  • 首先,由于一些非常奇怪的原因,您没有记录错误消息本身。它应该如何在没有错误消息的情况下修复错误?记录诸如“无法处理查询...”之类的内容有什么用?
  • 接下来,您必须检查每个操作的结果 - 因此,也必须检查准备。
  • 接下来,如果不知道错误发生在哪里,就很难发现错误。错误消息中必须包含一些调试回溯。
  • 接下来,不应该有 Location 标头,而只有 Status:500。因此,不要重定向到错误页面,只需包含它。
  • 最后,所有上述任务都必须在一个地方执行,即 - 在注册为自定义错误处理程序的函数中

所以,场景必须是这样的

在您的引导文件中创建这样的代码

set_error_handler("myErrorHandler");
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    error_log("$errstr in $errfile:$errline");
    header('HTTP/1.1 500 Internal Server Error', TRUE, 500);
    readfile("500.html");
    exit;
}

然后,让你的mysqli代码像这样

$stmt = $mysqli->prepare("qwefq") or trigger_error($mysqli->error);

并记录所有错误

于 2013-08-26T00:30:50.610 回答