时间:2021-07-01 10:21:17 帮助过:100人阅读
- <br><!--?php <BR-->$file=fopen("welcome.txt","r"); <br>?> <br> <br>如果文件不存在,您会获得类似这样的错误: <br><br>Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: <br>No such file or directory in C:\webfolder\test.php on line 2为了避免用户获得类似上面的错误消息,我们在访问文件之前检测该文件是否存在: <br><u></u> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--?php <BR-->if(!file_exists("welcome.txt")) <br>{ <br>die("File not found"); <br>} <br>else <br>{ <br>$file=fopen("welcome.txt","r"); <br>} <br>?> <br> <br>现在,假如文件不存在,您会得到类似这样的错误消息: <br><br>File not found比起之前的代码,上面的代码更有效,这是由于它采用了一个简单的错误处理机制在错误之后终止了脚本。 <br><br>不过,简单地终止脚本并不总是恰当的方式。让我们研究一下用于处理错误的备选的 PHP 函数。 <br>创建自定义错误处理器 <br>创建一个自定义的错误处理器非常简单。我们很简单地创建了一个专用函数,可以在 PHP 中发生错误时调用该函数。 <br><br>该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 以及 error context): <br><br>语法 <br>error_function(error_level,error_message, <br>error_file,error_line,error_context)<br></li><li><table class="dataintable" style="BORDER-RIGHT: #888888 1px solid; BORDER-TOP: #888888 1px solid; MARGIN-TOP: 10px; BORDER-LEFT: #888888 1px solid; WIDTH: 606px; BORDER-BOTTOM: #888888 1px solid; FONT-FAMILY: Arial, Helvetica, sans-serif; BORDER-COLLAPSE: collapse"></li><li><tbody></li><li><tr></li><li><th style="BORDER-RIGHT: #888888 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #888888 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: baseline; BORDER-LEFT: #888888 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #888888 1px solid; BACKGROUND-COLOR: #cccccc; TEXT-ALIGN: left">参数</th></li><li><th style="BORDER-RIGHT: #888888 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #888888 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: baseline; BORDER-LEFT: #888888 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #888888 1px solid; BACKGROUND-COLOR: #cccccc; TEXT-ALIGN: left">描述</th></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">error_level</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef"></li><li><p style="MARGIN: 0px; LINE-HEIGHT: 18px">必需。为用户定义的错误规定错误报告级别。必须是一个值数。</p></li><li><p style="MARGIN: 0px 0px 2px; LINE-HEIGHT: 18px">参见下面的表格:错误报告级别。</p></td></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">error_message</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">必需。为用户定义的错误规定错误消息。</td></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">error_file</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">可选。规定错误在其中发生的文件名。</td></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">error_line</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">可选。规定错误发生的行号。</td></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">error_context</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。</td></tr></tbody></table></li><li><h3 style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 20px 0px 0px; PADDING-TOP: 0px">错误报告级别</h3></li><li><p style="MARGIN: 12px 0px 0px; LINE-HEIGHT: 18px">这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:</p></li><li><table class="dataintable" style="BORDER-RIGHT: #888888 1px solid; BORDER-TOP: #888888 1px solid; MARGIN-TOP: 10px; BORDER-LEFT: #888888 1px solid; WIDTH: 606px; BORDER-BOTTOM: #888888 1px solid; FONT-FAMILY: Arial, Helvetica, sans-serif; BORDER-COLLAPSE: collapse"></li><li><tbody></li><li><tr></li><li><th style="BORDER-RIGHT: #888888 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #888888 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: baseline; BORDER-LEFT: #888888 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #888888 1px solid; BACKGROUND-COLOR: #cccccc; TEXT-ALIGN: left">值</th></li><li><th style="BORDER-RIGHT: #888888 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #888888 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: baseline; BORDER-LEFT: #888888 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #888888 1px solid; BACKGROUND-COLOR: #cccccc; TEXT-ALIGN: left">常量</th></li><li><th style="BORDER-RIGHT: #888888 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #888888 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: baseline; BORDER-LEFT: #888888 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #888888 1px solid; BACKGROUND-COLOR: #cccccc; TEXT-ALIGN: left">描述</th></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">2</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">E_WARNING</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">非致命的 run-time 错误。不暂停脚本执行。</td></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">8</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">E_NOTICE</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef"></li><li><p style="MARGIN: 0px; LINE-HEIGHT: 18px">Run-time 通知。</p></li><li><p style="MARGIN: 0px 0px 2px; LINE-HEIGHT: 18px">脚本发现可能有错误发生,但也可能在脚本正常运行时发生。</p></td></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">256</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">E_USER_ERROR</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。</td></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">512</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">E_USER_WARNING</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。</td></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">1024</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">E_USER_NOTICE</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。</td></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">4096</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">E_RECOVERABLE_ERROR</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())</td></tr></li><li><tr></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">8191</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">E_ALL</td></li><li><td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef"></li><li><p style="MARGIN: 0px; LINE-HEIGHT: 18px">所有错误和警告,除级别 E_STRICT 以外。</p></li><li><p style="MARGIN: 0px 0px 2px; LINE-HEIGHT: 18px">(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)</p></td></tr></tbody></table>现在,让我们创建一个处理错误的函数: <br><u></u> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>function customError($errno, $errstr) <br>{ <br>echo "<b>Error:</b> [$errno] $errstr<br>"; <br>echo "Ending Script"; <br>die(); <br>} <br> <br>上面的代码是一个简单的错误处理函数。当它被触发时,它会取得错误级别和错误消息。然后它会</li></ol></pre>输出错误级别和消息,并终止脚本。 <br><br>现在,我们已经创建了一个错误处理函数,我们需要确定在何时触发该函数。 <br>Set Error Handler <br>PHP 的默认错误处理程序是内建的错误处理程序。我们打算把上面的函数改造为脚本运行期间的默认错误处理程序。 <br><br>可以修改错误处理程序,使其仅应用到某些错误,这样脚本就可以不同的方式来处理不同的错误。不过,在本例中,我们打算针对所有错误来使用我们的自定义错误处理程序: <br><br>set_error_handler("customError");由于我们希望我们的自定义函数来处理所有错误,set_error_handler() 仅需要一个参数,可以添加第二个参数来规定错误级别。 <br><br>实例 <br>通过尝试</li></ol></pre>输出不存在的变量,来测试这个错误处理程序: <br><u></u> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--?php <BR-->//error handler function <br>function customError($errno, $errstr) <br>{ <br>echo "<b>Error:</b> [$errno] $errstr"; <br>} <br><br>//set error handler <br>set_error_handler("customError"); <br><br>//trigger error <br>echo($test); <br>?> <br> <br>以上代码的</li></ol></pre>输出应该类似这样: <br><br>Error: [8] Undefined variable: test触发错误 <br>在脚本中用户输入数据的位置,当用户的输入无效时触发错误的很有用的。在 PHP 中,这个任务由 trigger_error() 完成。 <br><br>例子 <br>在本例中,如果 "test" 变量大于 "1",就会发生错误: <br><u></u> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--?php <BR-->$test=2; <br>if ($test>1) <br>{ <br>trigger_error("Value must be 1 or below"); <br>} <br>?> <br> <br>以上代码的</li></ol></pre>输出应该类似这样: <br><br>Notice: Value must be 1 or below <br>in C:\webfolder\test.php on line 6您可以在脚本中任何位置触发错误,通过添加的第二个参数,您能够规定所触发的错误级别。 <br><br>可能的错误类型: <br>E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。 <br>E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。 <br>E_USER_NOTICE - 默认。用户生成的 run-time 通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生。 <br>例子 <br>在本例中,如果 "test" 变量大于 "1",则发生 E_USER_WARNING 错误。如果发生了 E_USER_WARNING,我们将使用我们的自定义错误处理程序并结束脚本: <br><u></u> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--?php <BR-->//error handler function <br>function customError($errno, $errstr) <br>{ <br>echo "<b>Error:</b> [$errno] $errstr<br>"; <br>echo "Ending Script"; <br>die(); <br>} <br><br>//set error handler <br>set_error_handler("customError",E_USER_WARNING); <br><br>//trigger error <br>$test=2; <br>if ($test>1) <br>{ <br>trigger_error("Value must be 1 or below",E_USER_WARNING); <br>} <br>?> <br> <br>以上代码的</li></ol></pre>输出应该类似这样: <br><br>Error: [512] Value must be 1 or below <br>Ending Script现在,我们已经学习了如何创建自己的 error,以及如何处罚它们,现在我们研究一下错误记录。 <br>错误记录 <br>默认地,根据在 php.ini 中的 error_log 配置,PHP 向服务器的错误记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。 <br><br>通过电子邮件向您自己发送错误消息,是一种获得指定错误的通知的好办法。 <br><br>通过 E-Mail 发送错误消息 <br>在下面的例子中,如果特定的错误发生,我们将发送带有错误消息的电子邮件,并结束脚本: <br><u></u> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--?php <BR-->//error handler function <br>function customError($errno, $errstr) <br>{ <br>echo "<b>Error:</b> [$errno] $errstr<br>"; <br>echo "Webmaster has been notified"; <br>error_log("Error: [$errno] $errstr",1, <br>"someone@example.com","From: webmaster@example.com"); <br>} <br>//set error handler <br>set_error_handler("customError",E_USER_WARNING); <br><br>//trigger error <br>$test=2; <br>if ($test>1) <br>{ <br>trigger_error("Value must be 1 or below",E_USER_WARNING); <br>} <br>?> <br> <br>以上代码的</li></ol></pre>输出应该类似这样: <br><br>Error: [512] Value must be 1 or below <br>Webmaster has been notified接收自以上代码的邮件类似这样: <br><br>Error: [512] Value must be 1 or below这个方法不适合所有的错误。常规错误应当通过使用默认的 PHP 记录系统在服务器上进行记录。 <br><br>错误回溯 <br><br><br>定义和用法 <br>PHP debug_backtrace() 函数生成一个 backtrace。 <br><br>该函数返回一个关联数组。下面是可能返回的元素: <br>
- <table class="dataintable" style="BORDER-RIGHT: #888888 1px solid; BORDER-TOP: #888888 1px solid; MARGIN-TOP: 10px; BORDER-LEFT: #888888 1px solid; WIDTH: 606px; BORDER-BOTTOM: #888888 1px solid; FONT-FAMILY: Arial, Helvetica, sans-serif; BORDER-COLLAPSE: collapse">
- <tbody>
- <tr>
- <th style="BORDER-RIGHT: #888888 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #888888 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: baseline; BORDER-LEFT: #888888 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #888888 1px solid; BACKGROUND-COLOR: #cccccc; TEXT-ALIGN: left">名称</th>
- <th style="BORDER-RIGHT: #888888 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #888888 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: baseline; BORDER-LEFT: #888888 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #888888 1px solid; BACKGROUND-COLOR: #cccccc; TEXT-ALIGN: left">类型</th>
- <th style="BORDER-RIGHT: #888888 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #888888 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: baseline; BORDER-LEFT: #888888 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #888888 1px solid; BACKGROUND-COLOR: #cccccc; TEXT-ALIGN: left">描述</th></tr>
- <tr>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">function</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">字符串</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">当前的函数名。</td></tr>
- <tr>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">line</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">整数</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">当前的行号。</td></tr>
- <tr>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">file</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">字符串</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">当前的文件名。</td></tr>
- <tr>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">class</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">字符串</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">当前的类名</td></tr>
- <tr>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">object</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">对象</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">当前对象。</td></tr>
- <tr>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">type</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">字符串</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">当前的调用类型,可能的调用:
- <ul class="listintable" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 20px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none">
- <li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: disc">返回: "->" - 方法调用
- </li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: disc">返回: "::" - 静态方法调用
- </li><li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: disc">返回 nothing - 函数调用 </li></ul></td></tr>
- <tr>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">args</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">数组</td>
- <td style="BORDER-RIGHT: #aaaaaa 1px solid; PADDING-RIGHT: 15px; BORDER-TOP: #aaaaaa 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; VERTICAL-ALIGN: text-top; BORDER-LEFT: #aaaaaa 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #aaaaaa 1px solid; BACKGROUND-COLOR: #efefef">如果在函数中,列出函数参数。如果在被引用的文件中,列出被引用的文件名。</td></tr></tbody></table>语法 <br>debug_backtrace()例子 <br><u></u> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><!--?php <BR-->function one($str1, $str2) <br>{ <br>two("Glenn", "Quagmire"); <br>} <br>function two($str1, $str2) <br>{ <br>three("Cleveland", "Brown"); <br>} <br>function three($str1, $str2) <br>{ <br>print_r(debug_backtrace()); <br>} <br><br>one("Peter", "Griffin"); <br>?> <br> <br></li></ol></pre>输出: <br><br>Array <br>( <br>[0] => Array <br>( <br>[file] => C:\webfolder\test.php <br>[line] => 7 <br>[function] => three <br>[args] => Array <br>( <br>[0] => Cleveland <br>[1] => Brown <br>) <br>) <br>[1] => Array <br>( <br>[file] => C:\webfolder\test.php <br>[line] => 3 <br>[function] => two <br>[args] => Array <br>( <br>[0] => Glenn <br>[1] => Quagmire <br>) <br>) <br>[2] => Array <br>( <br>[file] => C:\webfolder\test.php <br>[line] => 14 <br>[function] => one <br>[args] => Array <br>( <br>[0] => Peter <br>[1] => Griffin <br>) <br>) <br>)