|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在这里想谈谈自己这六个多月的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"); } ?>
复制代码 如今,假设文件不存在,您会失掉相似如许的毛病动静:
比起之前的代码,下面的代码更无效,这是因为它采取了一个复杂的毛病处置机制在毛病以后终止了剧本。
不外,复杂地终止剧本其实不老是得当的体例。让咱们研讨一下用于处置毛病的备选的 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"); } ?>
复制代码 以上代码的输入应当相似如许:
- Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 20
复制代码 您可以在剧本中任何地位触发毛病,经由过程添加的第二个参数,您可以划定所触发的毛病级别。
能够的毛病类型:
- E_USER_ERROR - 致命的用户生成的 run-time 毛病。毛病没法恢复。剧本履行被中止。
- E_USER_WARNING - 非致命的用户生成的 run-time 正告。剧本履行不被中止。
- E_USER_NOTICE - 默许。用户生成的 run-time 告诉。剧本发明了能够的毛病,也有能够在剧本运转正常时产生。
例子
在本例中,假如 "test" 变量大于 "1",则产生 E_USER_WARNING 毛病。假如产生了 E_USER_WARNING,咱们将利用咱们的自界说毛病处置法式并停止剧本:
- Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 21
复制代码 以上代码的输入应当相似如许:
- Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 22
复制代码 如今,咱们已进修了若何创立本人的 error,和若何处分它们,如今咱们研讨一下毛病纪录。
毛病纪录
默许地,依据在 php.ini 中的 error_log 设置装备摆设,PHP 向办事器的毛病纪录体系或文件发送毛病纪录。经由过程利用 error_log() 函数,您可以向指定的文件或近程目标地发送毛病纪录。
经由过程电子邮件向您本人发送毛病动静,是一种取得指定毛病的告诉的好举措。
经由过程 E-Mail 发送毛病动静
鄙人面的例子中,假如特定的毛病产生,咱们将发送带有毛病动静的电子邮件,并停止剧本:
- Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 23
复制代码 以上代码的输入应当相似如许:
- Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 24
复制代码 吸收自以上代码的邮件相似如许:
- Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 25
复制代码 这个办法不合适一切的毛病。惯例毛病应该经由过程利用默许的 PHP 纪录体系在办事器长进行纪录。
即使你理解不了PHP,但是也必须先跟它混个脸熟,看,一遍遍的看,看的同时一边琢磨,一边按照它所教的打代码,即使你搞不清楚那些代码到底是干嘛的,但是起码你应该找找感觉。 |
|