我很熟悉的一些基础知识,但我想知道更多关于是什么时候和为什么错误的处理(包括投掷的例外情况)应使用在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表单来捕获和分析异常,而无需维护数据库或可公开访问的服务器。有一个教程这里解释了这个过程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top