【问题标题】:custom error handling system efficiency自定义错误处理系统效率
【发布时间】:2013-08-25 23:57:02
【问题描述】:

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

我的错误处理系统只关注意外错误,例如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; 
  • 这是在准备好的语句中捕捉错误的好方法吗?

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

第 2 步记录错误

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

第 3 步处理数学运算

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

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

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

【问题讨论】:

  • 你真的需要像 $databaseHandlingHandlerUsedToHandleADatabase 这样的变量名吗?你不能只使用 $db 或 $mysqli 吗?

标签: php error-handling mysqli


【解决方案1】:

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

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

所以,场景必须是这样的

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

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);

并记录所有错误

【讨论】:

  • 谢谢,调用函数error log的时候,这个错误放在哪里,是放在默认的error log文件中吗?您可以创建自己的目的地吗?那么ajax请求呢,你如何调用错误500,它只会在请求而不是页面中调用它,你会从ajax请求中查找错误并从那里显示错误消息吗?
  • 错误日志目标由 ini 指令 error_log 设置。如果未设置,则进入 Web 服务器的错误日志。检查您的 AJAX 库文档 - 每个 AJAX 执行函数都有一个用于 HTTP 状态的变量。您可以在您的 JS 中相应地检查它。例如查看 jquery 的 statusCode
  • 好的,谢谢,帮了很多忙,请问什么是 php 引导文件,它只是您在每个页面上都需要的文件,是否可以要求它自动说 .htaccess 或者我必须手动要求它?
  • 是的,这是您在每一页上都需要的文件。有一种方法可以通过 php.ini/.htaccess 做到这一点,但我建议不要这样做
猜你喜欢
  • 1970-01-01
  • 2017-10-14
  • 2013-02-12
  • 2011-01-29
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 2018-03-23
相关资源
最近更新 更多