题
我很熟悉的一些基础知识,但我想知道更多关于是什么时候和为什么错误的处理(包括投掷的例外情况)应使用在PHP,特别是在活动网站或网页应用程序。是什么东西,可以使用过度和如果是这样,什么是过度使用看起来像什么?有些情况下,不应该使用?此外,什么都是一些共同的安全关切方面的错误处理?
解决方案
有一件事添加到什么说已经是它的最重要的是你记录的任何错误,在你的网页应用程序进入一个记录。这样,如杰夫"编码恐怖"阿特伍德建议时,你知道你的用户遇到的麻烦您应用程序(而不是"要求他们什么是错误").
要做到这一点,我建议下列类型的基础设施:
- 创建一个"崩溃"表在你的数据库和一套包装类的用于报告错误。我建议设定类别的崩溃("阻断","安全","PHP error/warning"(vs例外),等等)。
- 在所有的你的错误代码处理,确保记录的错误。始终如一地这样做取决于你如何建API(上述步骤)-它应该是 微不足道 记录崩溃,如果做的权利。
额外的信贷:有时候,你的崩溃将数据库级崩溃:即数据库服务器下来,等等。如果是这种情况下,你的错误记录的基础设施(上述)将失败(你不能记录崩溃的数据库,因为登录尝试写的DB)。在这种情况下,我会写故障逻辑崩溃的包装类任
- 发送电子邮件管理员,和/或
- 记录的详细信息的崩溃以纯文本文件
所有这听起来像一个矫枉过正,但相信我,这使得一个区别在应用程序是否被接受作为"稳定的"或"状".这种差异是来自事实上,所有应用程序的启动作片状/崩溃的时候,但那些开发,知道有关的所有问题与他们的程序有一个机会,以实际解决它。
其他提示
粗略地说,错误是PHP的遗产,而异常是处理错误的现代方法。最简单的方法是设置一个抛出异常的错误处理程序。这样,所有错误都转换为异常,然后您可以简单地处理一个错误处理方案。以下代码会将错误转换为异常:
function exceptions_error_handler($severity, $message, $filename, $lineno) {
if (error_reporting() == 0) {
return;
}
if (error_reporting() & $severity) {
throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
}
set_error_handler('exceptions_error_handler');
error_reporting(E_ALL ^ E_STRICT);
但有一些情况,其中代码专门用于处理错误。例如, DomDocument <的
schemaValidate
方法/ code> 在验证文档时引发警告。如果将错误转换为异常,它将在第一次失败后停止验证。有时这是你想要的,但是在验证文档时,你可能实际上想要所有失败。在这种情况下,您可以临时安装收集错误的错误处理程序。这是一个小片段,我用于此目的:
class errorhandler_LoggingCaller {
protected $errors = array();
function call($callback, $arguments = array()) {
set_error_handler(array($this, "onError"));
$orig_error_reporting = error_reporting(E_ALL);
try {
$result = call_user_func_array($callback, $arguments);
} catch (Exception $ex) {
restore_error_handler();
error_reporting($orig_error_reporting);
throw $ex;
}
restore_error_handler();
error_reporting($orig_error_reporting);
return $result;
}
function onError($severity, $message, $file = null, $line = null) {
$this->errors[] = $message;
}
function getErrors() {
return $this->errors;
}
function hasErrors() {
return count($this->errors) > 0;
}
}
用例:
$doc = new DomDocument();
$doc->load($xml_filename);
$validation = new errorhandler_LoggingCaller();
$validation->call(
array($doc, 'schemaValidate'),
array($xsd_filename));
if ($validation->hasErrors()) {
var_dump($validation->getErrors());
}
无法处理的错误会停止脚本,仅此一点就是处理它们的理由。
通常,您可以使用Try-Catch块来处理错误
try
{
// Code that may error
}
catch (Exception $e)
{
// Do other stuff if there's an error
}
如果您想停止显示在页面上的错误或警告消息,那么您可以在呼叫前加上@符号。
@mysql_query($query);
通过查询,这样做通常是一个好主意,这样你就可以更好地了解正在发生的事情。
@mysql_query($query)
or die('Invalid query: ' . mysql_error() . '<br />Line: ' . __LINE__ . '<br />File: ' . __FILE__ . '<br /><br />');
如果您没有明确控制脚本正在处理的数据,则应使用错误处理。我倾向于经常使用它,例如在表单验证等地方。知道如何在代码中发现容易出错的位置需要一些练习:一些常见的是在返回值的函数调用之后,或者在处理来自数据库查询的结果时。你永远不应该假设函数的返回将是你期望的,你应该确保编码的预期。您不必使用try / catch块,尽管它们很有用。很多时候你可以使用简单的if / else检查。
错误处理与安全编码实践密切相关,因为存在大量“错误”。这不会导致您的脚本崩溃。虽然不是严格意义上的错误处理本身,addbytes有一篇关于安全PHP编程基础知识的4篇系列文章,你可以找到这里。关于诸如 mysql_real_escape_string 和正则表达式,可以非常有效地确认内容用户输入数据。
恕我直言的最佳做法是使用以下方法: 1.创建错误/异常处理程序 2.在app启动时启动它 3.从里面处理你的所有错误
<?php
class Debug {
public static setAsErrorHandler() {
set_error_handler(array(__CLASS__, '__error_handler'));
}
public static function __error_handler($errcode, $errmsg, $errfile, $errline) {
if (IN DEV) {
print on screen
}
else if (IN PRO) {
log and mail
}
}
}
调试:: setAsErrorHandler();
&GT;
您可以将其存储在日志中,而不是输出mysql_error。这样你可以跟踪错误(并且你不依赖于用户报告它),你可以进入并删除问题。
最好的错误处理是对用户透明的那种,让你的代码解决问题,不需要让那个用户同事。
除了在代码中立即处理错误外,您还可以使用
http://us.php.net/manual /en/function.set-exception-handler.php 结果 和结果 http://us.php.net/manual/en/ function.set-误差handler.php
我发现设置自己的异常处理程序特别有用。发生异常时,您可以执行不同的操作,具体取决于它的异常类型。
例如:当 mysql_connet
调用返回 FALSE
时,我抛出一个 new DBConnectionException(mysql_error())
并将其处理为“特殊”。方式:记录错误,数据库连接信息(主机,用户名,密码)等,甚至可能通过电子邮件发送开发团队通知他们数据库可能出现问题
我使用它来赞美标准错误处理。我不建议过度使用这种方法
使用@进行错误抑制非常慢。
您还可以使用Google表单来捕获和分析异常,而无需维护数据库或可公开访问的服务器。有一个教程这里解释了这个过程。