我有一个使用PHP和Mysqli构建的网站,我正处于我应该考虑错误处理的部分。
即使我认为我的代码是完美的错误,当我向公众发布网站时也会出现错误。我发现this answer显示了我如何为用户隐藏错误,但开发人员仍然可以看到它们。虽然我不知道这是否真的是我网站的最佳方法。我不希望用户看到我的PHP本身产生的丑陋的错误消息,但我可以根据错误设计我自己的错误消息。
答案 0 :(得分:2)
PHP具有内置函数来捕获各种类型的错误:
set_error_handler
您应该使用此功能捕获所有页面中的错误,您可以编写自定义代码,无论是向数据库插入错误,还是写入单独的错误日志文件,或通过电子邮件立即通知开发人员,您可以决定
答案 1 :(得分:0)
我首先要使用
try
{
//your code here
}
catch(Exception $ex)
{
echo $ex->getMessage();
}
进行数据库查询时。错误处理可以将其登录到文件或类似的东西。 这样你就能发现正在发生的事情并为自己设定需要做的事情......
答案 2 :(得分:0)
error_reporting(E_ALL);
ini_set('display_errors','On');
ini_set('error_log', 'error.log');
ini_set('log_errors', 'On');
这些函数将显示错误(如果有的话)它还会在error.log中列出错误。 如果要隐藏错误,不要在网站上显示,那么您可以将值从“开”设置为“关”。 如果您只想从用户而不是开发人员隐藏它,那么您可以设置“ini_set('display_errors','off');”所以用户看不到这些,但开发人员可以从error.log
解决它答案 3 :(得分:0)
我该如何处理这些错误?
您应该记录它们并分析日志以解决它们(或者至少确保您的网站是安全的)。
我应该将它们全部保存在数据库中吗?
不 - 您将失去对数据库连接问题的可见性。正确的方法是通过本地计算机上的syslog功能。
我如何知道可能发生的错误?
?所有这些。
答案 4 :(得分:0)
处理错误是应用程序最重要的方面之一。用户希望它能够正常工作,但是当发生错误时,无论用户有多好,他们都可能对您的应用程序失去信心。我学到了很多东西。
我们使用类似于以下的类:
class ErrorHandler
{
public static function registerHandlers()
{
$inst = new ErrorHandler;
set_error_handler(array(&$inst, 'errorHandler'), E_ALL);
set_exception_handler(array(&$inst, 'exceptionHandler'));
register_shutdown_function(array(&$inst, 'shutdownHandler'));
}
public function shutdownHandler()
{
if (($error = error_get_last()))
{
$this->_clearOutputBuffers();
// Handle error
}
}
public function errorHandler($errno, $errstr, $errfile, $errline, $errcontext)
{
$this->_clearOutputBuffers();
// Handle error
}
public function exceptionHandler(Exception $exception)
{
$this->_clearOutputBuffers();
// Handle error
}
private function _getErrorCode($sMessage, $sFile, $nLine, $nCode)
{
$errorCode = sprintf("%u", crc32($sMessage.$sFile.$nLine.$nCode));
}
private function _clearOutputBuffers()
{
if (count(ob_list_handlers()) > 0)
{
ob_clean();
}
}
}
这个类能够捕获大多数错误,并且在调试时也能很好地工作。当捕获到错误时,我们将所有信息写入我们稍后可以引用的文件中。此外,我们将开发和生产之间的环境分开,并为其分别设置错误屏幕。
对于开发环境,我们使用错误屏幕显示文件的提取,堆栈跟踪和变量。
对于生产环境,我们显示一个错误屏幕,其中包含从_getErrorCode返回的错误编号。如果客户想要就错误与我们联系,他所要做的就是告诉我们这个号码,我们可以立即查询并将所有数据放在我们面前。
我附上了开发错误屏幕的截图。