在 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 中发生错误时调用该函数。
该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 以及 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 | 非致命的 run-time 错误。不暂停脚本执行。 |
8 | E_NOTICE |
Run-time 通知。 脚本发现可能有错误发生,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler()) |
8191 | E_ALL |
所有错误和警告,除级别 E_STRICT 以外。 (在 PHP 6.0,E_STRICT 是 E_ALL 的一部分) |
现在,让我们创建一个处理错误的函数:
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Ending Script"; die(); }
上面的代码是一个简单的错误处理函数。当它被触发时,它会取得错误级别和错误消息。然后它会输出错误级别和消息,并终止脚本。
现在,我们已经创建了一个错误处理函数,我们需要确定在何时触发该函数。
Set Error Handler
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 - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
- E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
- E_USER_NOTICE - 默认。用户生成的 run-time 通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生。
例子
在本例中,如果 "test" 变量大于 "1",则发生 E_USER_WARNING 错误。如果发生了 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
现在,我们已经学习了如何创建自己的 error,以及如何触发它们,现在我们研究一下错误记录。
错误记录
默认地,根据在 php.ini 中的 error_log 配置,PHP 向服务器的错误记录系统或文件发送错误记录。通过使用 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, "someone@example.com","From: webmaster@example.com"); } //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 记录系统在服务器上进行记录。
相关推荐
总的来说,PHP错误处理是通过结合`set_error_handler()`、`error_reporting()`和自定义错误处理函数来实现的,这样可以更有效地管理错误,提供更专业的错误反馈,同时确保程序的安全性。通过适当的错误处理,开发者...
标题中的"ecshop在高版本PHP错误处理之修改好的"表明了这个压缩包文件是针对ECSHOP在运行于高版本PHP环境时遇到的错误进行了优化和修复。ECSHOP是一款开源的电子商务系统,它可能在PHP版本升级后出现兼容性问题,...
### PHP 错误处理机制详解 #### 一、引言 在PHP开发中,错误处理是一项重要的技术。良好的错误处理机制不仅能帮助开发者更好地调试代码,还能提升用户体验,尤其是在Web应用程序中。本文将深入探讨PHP中的错误处理...
计算机后端-PHP最佳开发入门实战课程09-01 PHP错误处理方式.mp4
知识点一:PHP错误处理 在PHP中,错误处理通常是指对程序运行中出现的非预期情况的处理。PHP提供了一套错误处理机制,包括错误级别和错误处理函数。错误级别从低到高依次有:E_ERROR、E_WARNING、E_PARSE、E_NOTICE...
## 关于PHP错误处理 ### 一、使用`die()`函数,处理错误 `die()`函数在PHP中是一个非常实用的工具,它用于在遇到特定错误或条件时立即终止脚本的执行,并且可以选择性地向用户输出一条消息。这在调试阶段特别有用...
PHP Error 是一个专门为开发者设计的开源PHP类库,它的主要目标是改善标准PHP错误处理机制,为开发过程中遇到的问题提供更清晰、更有帮助的错误信息。这个类库不仅提供了友好的错误报告方式,还集成了语法高亮显示,...
使用自定义错误处理函数时需要注意,如果错误发生在脚本执行之前,由于自定义错误处理函数还未注册,因此不会触发自定义的错误处理逻辑,此时只能依赖PHP的默认错误处理机制。 总之,PHP的错误处理机制提供了丰富的...
本文介绍了一个PHP错误处理的封装类,它通过面向对象的方式将错误处理的逻辑进行封装,以便复用,并且提供了日志记录和邮件通知的功能。 首先,我们定义了一个名为MyErrorHandler的类,这个类负责处理不同类型的...
总之,理解和掌握这些PHP错误处理策略对于构建健壮、安全的应用至关重要。在开发过程中,充分利用错误报告来提升代码质量,而在部署时,要确保错误处理方式不会暴露系统的脆弱性。通过合理的配置和使用异常处理,...
【标题】:“带美化错误提示的留言本”项目解析 在IT行业中,用户界面的友好性和易用性是至关重要的,特别是在开发Web应用...对于学习者来说,这是一个很好的实践案例,可以深入理解PHP错误处理机制以及前端美化技巧。
RFC:PHP 错误处理程序 尝试编写详细说明标准 PHP 错误处理程序的 PSR 样式标准文档。 标准文件 主要的错误处理程序规范: 。 理由和其他信息: 。 运行测试套件 composer install vendor/bin/archer 需要在PATH ...
在PHP编程中,错误处理和异常处理是确保代码健壮性、可靠性和安全性的重要组成部分。在上述内容中,提到了PHP处理错误的两种主要方法:错误处理和异常处理。 首先,我们来了解一下PHP中的错误处理机制。PHP提供了...
很好的 php 错误处理 执照 麻省理工学院执照 安装 使用 composer create neha/neha安装它 或者直接下载,只有一个文件 源代码中有一些漂亮的例子,所以看看它 非常欢迎拉取请求,喜欢向他人学习
PHP是一种广泛使用的服务器端脚本语言,它提供了丰富的函数用于处理各种运行时情况,包括错误处理。本文主要探讨PHP中的一个非常有用的函数——register_shutdown_function。这个函数能够注册一个用户自定义的函数,...
轻松学PHP之PHP的错误和异常处理,可以轻松学习PHP。PHP学习的宝典。PHP的错误和异常处理是非常重要的。
通过这些知识点,我们可以了解 PHP 和 MySQL 的基本概念和使用方法,包括表单处理、数组处理、错误处理、字符串处理、SQL 优化、SQL 函数、MySQL 数据库、PHP 和 MySQL 连接、PHP 和 MySQL 操作等方面。