php异常、错误处理机制
1.php中try catch可以帮助我们捕获程序代码的异常了,这样我们可以很好的处理一些不必要的错误了,感兴趣的朋友可以一起来看看。
PHP中try{}catch{}语句概述
PHP5添加了类似于其它语言的异常处理模块。在 PHP 代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获。(注:一定要先抛才能获取)
需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常。
每一个 try 至少要有一个与之对应的 catch。
使用多个 catch可以捕获不同的类所产生的异常。
当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。
当然,PHP允许在 catch 代码块内再次抛出(throw)异常。
当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。
如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息。
先来看一下PHP内置异常类的基本属性和方法。(不包括具体实现)
try{ } catch(){ throw new Exception(); } catch(){ //这里可以捕获到前面一个块抛出的Exception }
如果抛出了一个异常,try语句中的脚本将会停止执行,然后马上转向执行catch语句中的脚本。
例子如下:
包含文件错误抛出异常
<?php // 错误的演示 try { require ('test_try_catch.php'); } catch (Exception $e) { echo $e->getMessage(); } // 正确的抛出异常 try { if (file_exists('test_try_catch.php')) { require ('test_try_catch.php'); } else { throw new Exception('file is not exists'); } } catch (Exception $e) { echo $e->getMessage(); }
2、通过set_exception_handler函数设置异常处理函数,在这种情况下,即使没有try{}catch{},throw抛出的异常也能由set_exception_handler设置的函数自动捕捉
set_exception_handler('exceptionHandler'); throw new Exception("kkkkkkkkkkkkkkkk"); function exceptionHandler(Exception $exception){ echo $exception->getMessage(); }
在PHP开发的时候常常会用到error_reporting(report_level)来调试自己的程序,下面列出了report_level可能值:
值 | 常量 | 描述 |
---|---|---|
1 | E_ERROR | 这是一个严重错误,不可恢复,如位置异常,内存不足等 |
2 | E_WARNING | 警告,最一般的错误,如函数的参数错误等 |
4 | E_PARSE | 解析错误,在解析PHP文件时产生,并强制PHP在执行前退出 |
8 | E_NOTICE | 通告表示可能在操作一些未知的变量等。在开发时可开启通告,以保证程序是"安全通告"的,瑞在正式系统中,应关闭通告 |
16 | E_CORE_ERROR | 这个内部错误是由于PHP加载扩展失败而导致的,并且会导致PHP停止运行并退出 |
32 | E_CORE_WARNING | PHP启动时初始化过程中的警告(非致命性错) |
64 | E_COMPILE_ERROR | 编译错误是在编译时发生,这个错误将导致PHP运行退出 |
128 | E_COMPILE_WARNING | 编译警告用于告诉用户一些不推荐的语法信息 |
256 | E_USER_ERROR | 用户定义的错误将导致辞PHP退出,它对是来自PHP自身,而是来自脚本文件中。 |
512 | E_USER_WARNING | 脚本使用它来通知一个执行失败,同时PHP也会用E_WARNING通知 |
1024 | E_USER_NOTICE | 用户定义的通告用于在脚本中表示可能存在的错误 |
2048 | E_STRICT | 编码标准化警告(建议如何修改以向前兼容) |
4096 | E_RECOVERABLE_ERROR | 接近致命的运行时错误,若未被捕获则视同E_ERROR |
8191 | E_ALL | 除E_STRICT外的所有错误(PHP6中为8191,即包含所有) |
例子:
任意数目的以上选项都可以用“或”来连接(用 OR 或 |),这样可以报告所有需要的各级别错误。例如,下面的代码关闭了用户自定义的错误和警告,执行了某些操作,然后恢复到原始的报错级别:
<?php //禁用错误报告 error_reporting(0); //报告运行时错误 error_reporting(E_ERROR | E_WARNING | E_PARSE); //报告所有错误 error_reporting(E_ALL); error_reporting(7); /* 设置php错误检测级别 E_ERROR - 致命性运行时错 (1) E_WARNING - 运行时警告(非致命性错)(2) E_PARSE - 编译时解析错误 (4) 1+2+4 = 7 */ ?>
如果设置了error_reporting(E_NOTICE),那么程序只会输出E_NOTICE等级的信息,一般我们使用的时候只需要设置error_reporting(E_ALL&!E_WARNING)就行了
上面我们看到有一种错误叫用户自定义的错误消息,这是什么呢?我们先看一个例子
set_error_handler('errorHandler'); trigger_error("aaaaaaassssssssssss",E_USER_ERROR); function errorHandler($errno,$errstr){ <span style="white-space:pre"> </span>if($errno==E_USER_ERROR){ <span style="white-space:pre"> </span>echo "innnnnnnni:",$errstr; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> }
输出结果:
innnnnnnni:aaaaaaassssssssssss
trigger_error()就是用来抛出用户自定义错误消息的函数,通过这个我们能抛出自定义的一些消息被当作错误来处理,比如严重的逻辑问题
上面的程序我们看到,当程序出错时,除了让Php默认输出出错信息外,我们还能设置自己的错误处理函数,设置的方法就是set_error_handler(),下面来看个例子
set_error_handler('errorHandler'); echo "dddddddddddd</br>"; echo $cc;//$cc没有定义,echo会出错 function errorHandler($errno,$errstr){ if($errno==E_NOTICE){ echo "innnnnnnni:",$errstr; } }
输出结果:
dddddddddddd
innnnnnnni:Undefined variable: cc