1 2 3 4 5 |
#错误处理 /* 错误处理:指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员。 |
1 2 3 4 5 6 |
#错误分类 1)语法错误:用户书写的代码不符合 PHP 的语法规范,语法错误会导致代码在编译的过程中不通过,所以代码不会执行(parse error) 2)运行是错误:代码编译通过,但是代码在执行的过程中会出现一些条件不妈祖导致的错误(runtime error) 3)逻辑错误:程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码执行,但是得不到想要的结果 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#错误代号 所有看到的错误代码在PHP中都被定义成了系统常量(可以直接使用) 1)系统错误: E_PARSE:编译错误,代码不会执行。 E_ERROR: fatal error,致命错误,会导致代码不能正确继续执行(出错的位置断掉) E_WARNING: warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果 E_NOTICE: notice,通知错误,不会影响代码执行 2)用户错误:E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE 用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到) 3)其他:E_ALL,代表着所有从错误(通常在进行错误控制的时候使用比较多),建议在开发过程中(开发环境)使用。 所有以E开头的错误常量(代号)其实都是由一个字节存储,然后每一种错误占据一个对应的位,如果想进行一些错误的控制,可以使用位运算进行操作, 排除通知级别notice: E_ALL &~E_NOTICE 只要警告和通知:E_WARNING | E_NOTICE */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#错误触发 //系统触发: $a = 100; //因为这里漏了;所以下面打印输出才会报错 echo $a; //Parse error: syntax error, unexpected 'echo' (T_ECHO) in //人为触发 $b=0; if($b==0){ //人为触发错误 trigger_error('除数不能为0!'); trigger_error('除数不能为0!',E_USER_ERROR); //可以使用第二参数设定级别,决定是否往下执行。 } echo '你好PHP'; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#错误显示设置 /* 错误显示设置:哪些错误该显示,以及该如何显示 在PHP中,其实有两种方式来设置当前脚本的错误处理 1、PHP的配置文件:全局配置:php.ini文件 display_errors:是否显示错误(on/1 开启;off/0 关闭) error_reporting:显示什么级别的错误 2、可以在运行的 PHP 脚本中设置 error_reporting(E_ALL ^ E_NOTICE); 脚本中设置的权限高于配置设置 ini_set('配置项目', 配置值); ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#错误日志设置 /* 在实际生产环境中,不会直接让错误赤裸裸的展示给用户: 1、不友好 2、不安全:错误会暴露网站很多信息(路径、文件名) 所以在生产环境中,一般不显示错误(错误也比较少),但是不可能避免会出现错误(测试的时候不会发现所有的问题),这个时候不希望看到,但是又希望捕捉到可以让后台程序员去修改:需要保存到日志文件中,需要在 PHP 配置文件中或者代码中(ini_set)设置对应的 error_log 的配置项处理 1)开启功能 log_errors=On //(on/1 开启;off/0 关闭) 2)指定路径 error_log=D:/Extensions/php/php5.4.45nts.log */ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#自定义错误处理 /* 最简单的错误处理:trigger_errors()函数,但是该函数不会阻止系统报错 PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加操系统错误处理的句柄中,然后系统会在碰到错误之后,使用用户定义的错误函数。 1、如何将用户自定义的函数放到系统中? set_error_handler() */ function my_error($errno, $errstr, $errfile, $errcontext){ if(!(error_reporting() & $errno)){ return false; } $msg = <<<EOD 错误等级:$errno <br/> 错误原因:$errstr <br/> 错误文件:$errfile <br/> 错误行数:$errcontext <br/> EOD; //echo $msg; switch($errno){ case E_ERROR: case E_USER_ERROR: $msg = <<<EOD 错误等级:ERROR 致命错误 <br/> 错误原因:$errstr <br/> 错误文件:$errfile <br/> 错误行数:$errcontext <br/> EOD; break; case E_WARNING: case E_USER_WARNING: $msg = <<<EOD 错误等级:WARNING 警告错误 <br/> 错误原因:$errstr <br/> 错误文件:$errfile <br/> 错误行数:$errcontext <br/> EOD; break; case E_NOTICE: case E_USER_NOTICE: $msg = <<<EOD 错误等级:NOTICE 通知错误 <br/> 错误原因:$errstr <br/> 错误文件:$errfile <br/> 错误行数:$errcontext <br/> EOD; break; } echo $msg; return true; } set_error_handler('my_error'); $a=222; echo $b; |