错误处理:
1.使用die()方法,结束语句的执行,并输出错误消息
2.自定义错误和错误触发器
自定义错误处理函数(系统有默认的错误处理函数,自定义的错误处理会覆盖默认的处理函数)
======================================================================
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 的一部分)
错误触发器:trigger_error($errMsg,$errType)
===========================================
作用:用于指定自定义的错误消息
可能的错误类型$errType:
E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
E_USER_NOTICE - 默认。用户生成的 run-time 通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生。
错误日志 error_log(error,[type],[destination],[headers])
========================================================
作用:用于将错误信息保存到指定文件或向远程目的地发送错误信息
参数 描述
error 必需。要记录的错误消息。
type 可选。规定错误记录的类型。
可能的记录类型:
0 - 默认。根据在 php.ini 文件中的 error_log 配置,错误被发送到服务器日志系统或文件。
1 - 错误被发送到 destination 参数中的地址。只有该类型使用 headers 参数。
2 - 通过 PHP debugging 连接来发送错误。该选项只在 PHP 3 中可用。
3 - 错误发送到文件目标字符串。
destination 可选。规定向何处发送错误消息。该参数的值依赖于 "type" 参数的值。
headers 可选。只在 "type" 为 1 时使用。
规定附加的头部,比如 From, Cc 以及 Bcc。由 CRLF (\r\n) 分隔。
注释:在发送电子邮件时,必须包含 From 头部。可以在 php.ini 文件中或者通过此参数设置。
$test=2;
if ($test>1)
{
error_log("A custom error has been triggered",1,"someone@example.com","From: webmaster@example.com");
}
PHP 异常处理
============
try{
可能出现异常的代码块
}catch(Exception $e){
处理异常/抛出异常
}
抛出一个异常:throw new Exception("异常信息");
Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象
注意:
当出现异常后,则出现异常的代码之后的代码不再执行
使用多个catch可以捕获多种类型的异常信息
PHP5.0 以前的函数没有异常机制,无法捕获异常,只能使用错误处理机制处理
设置顶层异常处理器 (Top Level Exception Handler)
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。
异常的规则
需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
使用多个 catch 代码块可以捕获不同种类的异常。
可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
简而言之:如果抛出了异常,就必须捕获它。
自定义异常类:class MyException1 extends Exception(){}
<?php // die()函数: // =========== // 例:当打开一个文件,如果不存在,则终止语句执行,并输出消息,否则继续执行 // file_exists("1.txt") or die("打开文件出错或文件不存在"); // echo "继续文件打开工作"; //自定义错误处理函数 //================== // //参数:$errorCode:错误级别的值,$errorMsg:错误消息 // function WarningError($errorVal,$errorMsg,$fielName,$line,$arrVal) // { // echo("<p>第<b>".$line."</b>行发生错误:</p>"); // echo("<p style='color:red'>错误消息:$errorMsg</p>"); // } // //注册自定义错误处理函数,对WARNING级别的错误进行处理 // set_error_handler("WarningError",E_WARNING);//第二个参数为可选错误级别,默认为E_ALL,即所有的错误 // $f = fopen("2.txt", "r"); //错误触发器:trigger_error($errMsg,$errType) //=========================================== //作用:用于指定自定义的错误消息 // 可能的错误类型$errType: function WarningError($errorVal,$errorMsg,$fielName,$line,$arrVal) { echo("<p>第<b>".$line."</b>行发生错误:</p>"); echo("<p style='color:red'>错误消息:$errorMsg</p>"); } function MainError($errorVal,$errorMsg,$fielName,$line,$arrVal) { echo("<p>第<b>".$line."</b>行发生错误:</p>"); echo("<p style='color:red'>错误消息:$errorMsg</p>"); } //注册自定义错误处理函数,对E_USER_ERROR级别的错误进行处理 set_error_handler("MainError",E_USER_ERROR); set_error_handler("WarningError",E_USER_WARNING); //设置年龄,当年年龄的区间不在指定区间内时,触发自定义的错误消息 function SetAge($value=0) { if($value<0) { trigger_error("输入年龄过小",E_USER_ERROR); } elseif ($value>=150) { trigger_error("输入年龄过大"); } elseif (!is_int($value)) { trigger_error("请输入正整数!",E_USER_WARNING); } echo("最后的代码执行了\n"); } // SetAge(180);//由于没有给默认的错误触发器注册自定义的E_USER_NOTICE级别错误处理函数,所以结果是 // Notice: 输入年龄过大 in D:\PHPEnv\WWW\test001.php on line 77 // 最后的代码执行了 // SetAge(-10); // 注册了E_USER_ERROR级别的错误处理函数后,输出结果为: // 第73行发生错误: // 错误消息:输入年龄过小 // 最后的代码执行了 // SetAge("aa"); // // // // // 错误日志 error_log(error,[type],[destination],[headers]) // =================== // 作用:用于将错误信息保存到指定文件或向远程目的地发送错误信息 // 参数 描述 // error 必需。要记录的错误消息。 // type 可选。规定错误记录的类型。 // 可能的记录类型: // 0 - 默认。根据在 php.ini 文件中的 error_log 配置,错误被发送到服务器日志系统或文件。 // 1 - 错误被发送到 destination 参数中的地址。只有该类型使用 headers 参数。 // 2 - 通过 PHP debugging 连接来发送错误。该选项只在 PHP 3 中可用。 // 3 - 错误发送到文件目标字符串。 // destination 可选。规定向何处发送错误消息。该参数的值依赖于 "type" 参数的值。 // headers 可选。只在 "type" 为 1 时使用。 // 规定附加的头部,比如 From, Cc 以及 Bcc。由 CRLF (\r\n) 分隔。 // 注释:在发送电子邮件时,必须包含 From 头部。可以在 php.ini 文件中或者通过此参数设置。 // $test=2; // if ($test>1) // { // error_log("A custom error has been triggered",1,"someone@example.com","From: webmaster@example.com"); // } date_default_timezone_set("PRC");//设置时区【也可以在php.ini中设置】 function SetPhone($value='0') { if(!is_string($value)) { error_log(date("Y-m-d G:i:s")."输入类型错误\r\n",3,"error.txt"); } else if (strlen($value)>11) { error_log(date("Y-m-d G:i:s")."号码长度过长\r\n",3,"error.txt"); } } //发生的错误信息会记录到当前文件同目录下的error.txt文件中 // SetPhone("1252345345456"); // SetPhone(12254); /* PHP 异常处理 ============ try{ 可能出现异常的代码块 }catch(Exception $e){ 处理异常/抛出异常 } 抛出一个异常:throw new Exception("异常信息"); Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。 Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch" Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象 注意: 当出现异常后,则出现异常的代码之后的代码不再执行 使用多个catch可以捕获多种类型的异常信息 PHP5.0 以前的函数没有异常机制,无法捕获异常,只能使用错误处理机制处理 设置顶层异常处理器 (Top Level Exception Handler) set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。 异常的规则 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。 使用多个 catch 代码块可以捕获不同种类的异常。 可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。 简而言之:如果抛出了异常,就必须捕获它。 自定义异常类:class MyException1 extends Exception(){} */ function DelUser($userName) { if($userName=="admin") { throw new Exception("删除失败"); } } // try{ // DelUser("admin"); // echo "我被执行了";//这句代码不会被执行(某句代码出异常了,则后面的代码不再执行) // }catch(Exception $e){//捕获异常信息 // echo($e->getMessage());//$e->getMessage()获得异常信息 // echo(" 错误行:".$e->getLine()); // } //设置顶层异常处理器 set_exception_handler() //作用:用于捕获未捕获的异常信息 function MyException($e) { echo "\n顶级异常处理器捕获异常:".$e->getMessage(); } set_exception_handler("MyException"); // DelUser("admin"); //自定义异常类:class MyException1 extends Exception class MyException1 extends Exception { } class MyException2 extends Exception { } function A() { throw new MyException1("aaa"); } function B() { throw new MyException2("bbb"); } try{ A(); B(); } catch(MyException1 $e1){ echo $e1->getMessage(); } catch(MyException2 $e2){ echo $e2->getMessage(); } ?>