PHP的错误和异常处理 - n哖苡逅 - 博客园 http://www.cnblogs.com/laojie4321/p/4187620.html
PHP的错误和异常处理
任何程序员在开发时都可能遇到过一些失误,或其他原因造成错误的发生。当然,用户如果不愿意或不遵循应用程序的约束,也会在使用时引起一些错误发生。PHP程序的错误发生一般归属于下列三个领域。
Ø 语法错误
语法错误最常见,并且最容易修复。例如,遗漏了一个分号,就会显示错误信息。这类错误会阻止脚本执行。通常发生在程序开发时,可以通过错误报告进行修复,再重新运行。
Ø 运行时错误
这种错误一般不会阻止PHP脚本的运行,但是会阻止脚本做希望它所做的任何事情。例如,在调用header()函数前如果有字符输出,PHP通常会显示一条错误消息,虽然PHP脚本继续运行,但header()函数并没有执行成功。
Ø 逻辑错误
这种错误实际上是最麻烦的,不但不会阻止PHP脚本的执行,也不会显示出错误消息。例如,在if语句中判断两个变量的值是否相等,如果错把比较运行符号“==”写成赋值运行符号“=”就是一种逻辑错误,很难会被发现。
一个异常则是在一个程序执行过程中出现的一个例外,或是一个事件,它中断了正常指令的运行,跳转到其他程序模块继续执行。所以异常处理经常被当做程序的控制流程使用。无论是错误还是异常,应用程序都必须能够以妥善的方式处理,并做出相应的反应,希望不要丢失数据或者导致程序崩溃。
10.1.1 错误类型和基本的调试方法
运行PHP脚本时,PHP解析器会尽其所能地报告它遇到的问题。在PHP中错误报告的处理行为,都是通过PHP的配置文件php.ini中有关的配置指令确定的。另外PHP的错误报告有很多种级别,可以根据不同的错误报告级别提供对应的调试方法。一旦把PHP设置成呈现出发生了哪些错误,你可能想调整错误报告的级别。在表10-1中列出了PHP中大多数的错误报告级别。
表10-1 PHP的错误报告级别
<DIV align=center>
级别常量 | 错误报告描述 |
E_ERROR | 致命的运行时错误(它会阻止脚本的执行) |
E_WARNING | 运行时警告(非致命的错误) |
E_PARSE | 从语法中解析错误 |
E_NOTICE | 运行时注意消息(可能是或者可能不是一个问题) |
E_CORE_ERROR | 类似E_ERROR,但不包括PHP核心造成的错误 |
E_CORE_WARNING | 类似E_WARNING,但不包括PHP核心错误警告 |
E_COMPILE_ERROR | 致命的编译时错误 |
E_COMPILE_WARNING | 致命的编译时警告 |
E_USER_ERROR | 用户导致的错误消息 |
E_USER_WARNING | 用户导致的警告 |
E_USER_NOTICE | 用户导致的注意消息 |
E_ALL | 所有的错误、警告和注意 |
E_STRICT | 关于PHP版本移植的兼容性和互操作性建议 |
</DIV>
如果用户希望在PHP脚本中,遇到上表中的某个级别的错误时,将错误消息报告给用户。则必须在配置文件php.ini中,将display_errors指令的值设置为On,开启PHP输出错误报告的功能。也可以在PHP脚本中调用ini_set()函数,动态设置配置文件php.ini中的某个指令。如果display_errors被启用,就会显示满足已设置的错误级别的所有错误。当用户在访问时,看到显示的这些消息不仅会感到迷惑,而且还可能会过多地泄露有关服务器的信息,使服务器变得很不安全。所以在项目开发或测试期间启用此指令,可以根据不同的错误报告更好的调试程序。出于安全性和美感的目的,让公众用户查看PHP的详细出错消息一般是不明智的,所以在网站投入使用时要将其禁用。
当你正在开发站点时,你将希望PHP报告特定类型的错误,可以通过调整错误报告的级别实现,可以通过以下两种方法设置错误报告级别。
Ø 可以通过在配置文件php.ini中,修改配置指令error_reporting的值,修改成功后重新启动Web服务器,则每个PHP脚本都可以按调整后的错误级别输出错误报告。下面是修改php.ini配置文件的示例,列出几种为error_reporting指令设置不同级别值的方式,可以把位运算符[&(与)、|(或)、~(非)]和错误级别常量一起使用。如下所示:
<DIV align=center>
; 可以抛出任何非注意的错误,默认值 error_reporting = E_ALL & ~E_NOTICE ; 只考虑致命的运行时错误、解析错误和核心错误 ; error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR ; 报告除用户导致的错误之外的所有错误 ; error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE) |
</DIV>
Ø 或者可以在PHP脚本中使用error_reporting()函数,基于各个脚本来调整这种行为。这个函数用于确定PHP应该在特定的页面内报告哪些类型的错误。该函数获取一个数字或上表中错误级别常量作为参数。如下所示:
<DIV align=center>
error_reporting(0); //设置为0会完全关闭错误报告 error_reporting (E_ALL); //将会向PHP报告发生的每个错误 error_reporting (E_ALL & ~E_NOTICE); //可以抛出任何非注意的错误报告 |
// 关闭所有PHP错误报告
error_reporting(0 );
// Report simple running errors
error_reporting ( E_ERROR | E_WARNING | E_PARSE );
// 报告 E_NOTICE也挺好 (报告未初始化的变量
// 或者捕获变量名的错误拼写)
error_reporting ( E_ERROR | E_WARNING | E_PARSE | E_NOTICE );
// 除了 E_NOTICE,报告其他所有错误
// 这是在 php.ini 里的默认设置
error_reporting ( E_ALL ^ E_NOTICE );
// 报告所有 PHP 错误 (参见 changelog)
error_reporting ( E_ALL );
// 报告所有 PHP 错误
error_reporting (- 1 );
// 和 error_reporting(E_ALL); 一样
ini_set ( 'error_reporting' , E_ALL );