最新的Web开发教程
 

PHP错误处理


在PHP默认的错误处理很简单。 用文件名,行号和描述错误的消息的错误消息被发送到浏览器。


PHP错误处理

在创建脚本和web应用程序,错误处理是一个重要的组成部分。 如果您的代码缺少错误检测编码,那么程序看上去很不专业,可能是开放的安全隐患。

本教程包含了一些最常见的错误检查PHP方法。

我们会表现出不同的错误处理方法:

  • 简单的" die() "语句
  • 自定义错误和错误触发器
  • 错误报告

基本的错误处理:使用die()函数

第一个例子表明,打开一个文本文件的简单脚本:

<?php
$file=fopen("welcome.txt","r");
?>

如果该文件不存在,你可能会得到这样的错误:

Warning : fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2

为了防止用户收到错误消息像上面的,我们测试文件是否存在之前,我们尝试访问它:

<?php
if(!file_exists("welcome.txt")) {
  die("File not found");
} else {
  $file=fopen("welcome.txt","r");
}
?>

现在,如果文件不存在,你会得到这样的错误:

File not found

上面的代码比前面的代码更有效,因为它使用了一个简单的错误处理机制在错误发生后停止脚本。

然而,简单地停止脚本并不总是正确的道路要走。 让我们来看看用于处理错误的替代PHP函数。


创建自定义错误处理程序

创建自定义错误处理程序非常简单。 我们简单地创建一个特殊的函数在PHP中发生错误,可以调用。

该函数必须能够处理至少两个参数(错误级别和错误消息),但是可以接受最多五个参数(optionally: file, line-number, and the error context)

句法

error_function(error_level,error_message,
error_file,error_line,error_context)
参数 描述
error_level 需要。 指定用户定义的错误错误报告水平。 必须是一个值数。 请参阅下面的错误报告级别表
error_message 需要。 指定用户定义的错误的错误消息
error_file 可选的。 指定发生错误的文件名
error_line 可选的。 指定发生错误的行号
error_context 可选的。 指定包含各变量的阵列,和它们的值,在使用中发生错误时

错误报告级别

这些错误报告级别是不同类型的错误的用户定义的错误处理程序,可用于:

不变 描述
2 E_WARNING 非致命的运行时错误。 脚本执行不被中断。
8 E_NOTICE 运行时通知。 脚本发现这可能是一个错误,但通常运行一个脚本时,也可能发生
256 E_USER_ERROR 致命的用户生成错误。 这就像使用PHP函数由程序员设置E_ERROR trigger_error()
512 E_USER_WARNING 非致命的用户生成的警告。 这就像使用PHP函数由程序员设置E_WARNING trigger_error()
1024 E_USER_NOTICE 用户生成通知。 这就像使用PHP函数由程序员设置E_NOTICE trigger_error()
4096 E_RECOVERABLE_ERROR 捕获的致命错误。 这是类似E_ERROR,但可以由用户定义的处理程序捕获(see also set_error_handler()
8191 E_ALL 所有的错误和警告(E_STRICT became a part of E_ALL in PHP 5.4)

现在,让我们创建一个函数来处理错误:

function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
}

上面的代码是一个简单的错误处理功能。 当它被触发时,它会错误级别和错误消息。 它随后输出该错误水平和消息,并且终止该脚本。

现在,我们已经创建了一个错误处理函数,我们需要确定在何时被触发。


设置错误处理程序

PHP的默认错误处理程序是内置的错误处理程序。 我们要作的脚本运行期间的默认错误处理程序上面的功能。

它有可能改变错误处理程序申请只有一些错误,这样脚本可以以不同方式处理不同的错误。 然而,在这个例子中,我们将使用我们的自定义错误处理程序对所有错误:

set_error_handler("customError");

因为我们希望我们的自定义函数来处理所有错误, set_error_handler()只需要一个参数,第二个参数可以被添加到指定的错误级别。

试图通过不存在的输出变量测试错误处理程序:

<?php
//error handler function
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr";
}

//set error handler
set_error_handler("customError");

//trigger error
echo($test);
?>

以上代码的输出应该是这样的:

Error: [8] Undefined variable: test

引发错误

在脚本中,用户可以输入数据,它是有用的,当非法输入时触发的错误。 在PHP中,这是由做trigger_error()函数。

在这个例子中,如果发生错误, "test"变量大于大"1"

<?php
$test=2;
if ($test>=1) {
  trigger_error("Value must be 1 or below");
}
?>

以上代码的输出应该是这样的:

Notice : Value must be 1 or below
in C:\webfolder\test.php on line 6

任何地方都可以触发一个错误,你希望在一个脚本,并通过添加第二个参数,你可以指定哪些错误级别被触发。

可能的错误类型:

  • E_USER_ERROR - 致命的用户生成运行时错误。 无法从恢复的错误。 脚本执行停止
  • E_USER_WARNING - 非致命的用户生成运行时警告。 脚本执行不被中断。
  • E_USER_NOTICE - 默认。 用户生成的运行时间另行通知。 脚本发现这可能是一个错误,但通常运行一个脚本时,也可能发生

在这个例子中,如果一个发生E_USER_WARNING "test"变量大于大"1" 。 如果发生了E_USER_WARNING,我们将使用我们的自定义错误处理程序并结束脚本:

<?php
//error handler function
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
}

//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>=1) {
  trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

以上代码的输出应该是这样的:

Error: [512] Value must be 1 or below
Ending Script

现在,我们已经学会了创造我们自己的错误,以及如何触发它们,让我们来看看在错误日志记录。


错误记录

默认情况下,PHP发送一个错误日志服务器的日志系统或文件,这取决于error_log配置如何在php.ini文件中设定。 通过使用error_log()函数,你可以发送错误日志到指定的文件或远程目标。

通过e-mail发送错误信息到自己可以的得到通知的具体错误的一个好方法。

通过电子邮件发送错误信息

在下面的例子中,我们将发送一封电子邮件,并显示错误消息并结束脚本,如果发生特定的错误:

<?php
//error handler function
function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Webmaster has been notified";
  error_log("Error: [$errno] $errstr",1,
  "[email protected]","From: [email protected]");
}

//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>=1) {
  trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

以上代码的输出应该是这样的:

Error: [512] Value must be 1 or below
Webmaster has been notified

而从上面的代码中收到的邮件是这样的:

Error: [512] Value must be 1 or below

这不应该与所有的错误使用。 常规错误应该使用默认的PHP记录系统在服务器上登录。