一、错误、异常 等级常量表 error:不能在编译期发现的运行期错误,不如试图用 echo 输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断; exception:程序执行过程中出现意料之外的情况,逻辑上往往是行得通的,但不符合应用场景,比如接收到一个长度长错预定格式的用户命名,因此,异常主要靠编码人员做预先做判断后抛出,捕获异常后改变程序流程来处理这些情况,不必中断程序。 PHP 对于异常和错误的界定似乎不是很明显,尤其是低版本的PHP。
错误和日志记录值 常量 说明 备注 2 E_WARNING (integer) 运行时警告 (非致命错误)。 |仅给出提示信息,但是脚本不会终止运行。 4 E_PARSE (integer) 编译时语法解析错误。 |解析错误仅仅由分析器产生。 8 E_NOTICE (integer) 运行时通知。 |表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。 16 E_CORE_ERROR(integer) PHP初始化启动过程中发生的致命错误。 |该错误类似 E_ERROR,但是是由PHP引擎核心产生的。 since PHP 4 32 E_CORE_WARNING(integer) PHP初始化启动过程中发生的警告 (非致命错误) 。 |类似 E_WARNING,但是是由PHP引擎核心产生的。 since PHP 4 64 E_COMPILE_ERROR(integer) 致命编译时错误。 |类似E_ERROR, 但是是由Zend脚本引擎产生的。 since PHP 4 128 E_COMPILE_WARNING(integer) 编译时警告 (非致命错误)。 |类似 E_WARNING,但是是由Zend脚本引擎产生的。 since PHP 4 256 E_USER_ERROR(integer) 用户产生的错误信息。 |类似 E_ERROR, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。 since PHP 4 512 E_USER_WARNING(integer) 用户产生的警告信息。 |类似 E_WARNING, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。 since PHP 4 1024 E_USER_NOTICE(integer) 用户产生的通知信息。 |类似 E_NOTICE, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。 since PHP 4 2048 E_STRICT (integer) 启用 PHP 对代码的修改建议。 |确保代码具有最佳的互操作性和向前兼容性, since PHP 5 4096 E_RECOVERABLE_ERROR(integer) 可被捕捉的致命错误。 |它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见 set_error_handler()),将成为一个 E_ERROR 从而脚本会终止运行。 since PHP 5.2.0 8192 E_DEPRECATED(integer) 运行时通知。 |启用后将会对在未来版本中可能无法正常工作的代码给出警告。 since PHP 5.3.0 16384 E_USER_DEPRECATED(integer) 户产少的警告信息。 |类似 E_DEPRECATED, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。 since PHP 5.3.0 30719 E_ALL (integer) E_STRICT出外的所有错误和警告信息。 30719 in PHP 5.3.x, 6143 in PHP 5.2.x, 2047 previously
二、error_reporting() 及 try-catch、thrown error_reporting() 函数可以获取(不传参时)、设定脚本处理哪些异常(并非所有异常都需要处理,例如 E_CORE_WARNING、E_NOTICE、E_DEPRECATED 是可以忽略的),该设定将覆盖 php.ini 中 error_reporting选项定义的异常处理设定。 例如: error_reporting(E_ALL&~E_NOTICE) ; // 除了E_NOTICE其他异常都会被触发(E_ALL&~E_NOTICE 的二进制运算结果是:E_NOTICE对应位的值被设置为0,应注意到,错误和日志记录值都是一个二进制数的某一位设置为1) try-catch 无法在类的自动加载函数 __autoload() 内生效。 try-catch 无法用于捕获异常,无法捕获错误,例如 trigger_error() 触发的错误,异常和错误是不一样的。
// you codes that maybe cause an error }catch(Exception $err){ // 这个错误对象需要声明类型, Exception 是系统默认异常处理类 echo $err->getMessage(); }
//thrown 可以抛出一个异常,如: thrown new Exception('an error'); 一个例子:
if ( empty( $var1 ) ) throw new NotEmptyException();
$model->write(); $template->render( 'error_empty' ); } catch ( InvalidInputException $e ) { $template->render( 'error_preg' ); }
Exception 类的结构:其中大部分方法都是 禁止改写的(final )
|