PHP中的错误处理、异常处理机制详解
2014-05-21 14:28
1066 查看
在编写PHP程序时,错误处理是一个重要的部分。如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门
例:
那么正确的写法应该如下:
A、简单的die()语句;
等价于exit();
例:
简洁写法:
B、自定义错误和错误触发器
1、错误处理器(自定义错误,一般用于语法错误处理)
创建自定义错误函数(处理器),该函数必须有能力处理至少两个参数(error_level和errormessage),但是可以接受最多五个参数(error_file、error_line、error_context)
语法:
functionerror_function($error_level,$error_message,$error_file,$error_line,$error_context)
//创建好后还需要改写set_error_handler();函数
set_error_handler('error_function',E_WARNING);//这里error_function对应上面创建的自定义处理器名,第二个参数为使用自定义错误处理器的错误级别;
错误报告级别(了解即可)
这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:
2、错误触发器(一般用于处理逻辑上的错误)
需求:比如要接收一个年龄,如果数字大于120,就认为是一个错误
传统方法:
使用触发器:
练习题:
C、错误日志
默认的根据php.ini中error_log配置,PHP向服务器的错误记录系统或文件发送错误记录。通过使用error_log()函数可以向文件或远程目的地发送错误记录;
语法:
error_log(error[,type,destination,headers])
type部分一般用3,表示在文件后面追加错误信息,而不会覆盖原内容destination表示目的地,即存放的文件或远程目的地
如:error_log("$error_info",3,"errors.txt");
1、基本语法
2、处理处理程序应当包括:
try-使用异常的函数应该位于"try"代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常;
throw-这里规定如何触发异常。每一个"throw"必须对应至少一个"catch";
catch-"catch"代码块会捕获异常,并创建一个包含异常信息的对象;
让我们触发一个异常:
例子解释:
上面的代码抛出了一个异常,并捕获了它:
创建checkNum()函数,它检测数字是否大于1,如果是,则抛出一个异常。
在"try"代码块中调用checkNum()函数。
checkNum()函数中的异常被抛出。
"catch"代码块接收到该异常,并创建一个包含异常信息的对象($e)。
通过从这个exception对象调用$e->getMessage(),输出来自该异常的错误消息。
[u]不过,为了遵循“每个throw必须对应一个catch”的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。[/u]
[u]set_exception_handler()函数可设置处理所有未捕获异常的用户定义函数。[/u]
创建一个自定义的异常类
可以使用多个catch来返回不同情况下的错误信息
异常的规则
需要进行异常处理的代码应该放入try代码块内,以便捕获潜在的异常。
每个try或throw代码块必须至少拥有一个对应的catch代码块。
使用多个catch代码块可以捕获不同种类的异常。
可以在try代码内的catch代码块中再次抛出(re-thrown)异常。
简而言之:如果抛出了异常,就必须捕获它。
例:
1 | <?php |
2 | $a = fopen ( 'test.txt' , 'r' ); |
3 | //这里并没有对文件进行判断就打开了,如果文件不存在就会报错 |
4 | ?> |
1 | <?php |
2 | if ( file_exists ( 'test.txt' )) { |
3 | $f = fopen ( 'test.txt' , 'r' ); |
4 | // 使用完后关闭 |
5 | fclose( $f ); |
6 | } |
7 | ?> |
一、PHP错误处理的三种方式
A、简单的die()语句;等价于exit();
例:
1 | if (! file_exists ( 'aa.txt' )) { |
2 | die ( '文件不存在' ); |
3 | } else { |
4 | // 执行操作 |
5 | } |
6 | // 如果上面die()被触发,那么这里echo接不被执行 |
7 | echo 'ok' ; |
1 | file_exits( 'aaa.txt' ) or die ( '文件不存在' ); |
2 | echo 'ok' ; |
1、错误处理器(自定义错误,一般用于语法错误处理)
创建自定义错误函数(处理器),该函数必须有能力处理至少两个参数(error_level和errormessage),但是可以接受最多五个参数(error_file、error_line、error_context)
语法:
functionerror_function($error_level,$error_message,$error_file,$error_line,$error_context)
//创建好后还需要改写set_error_handler();函数
set_error_handler('error_function',E_WARNING);//这里error_function对应上面创建的自定义处理器名,第二个参数为使用自定义错误处理器的错误级别;
错误报告级别(了解即可)
这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:
值 | 常量 | 描述 |
---|---|---|
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以外。(在PHP6.0,E_STRICT是E_ALL的一部分) |
需求:比如要接收一个年龄,如果数字大于120,就认为是一个错误
传统方法:
1 | <?php |
2 | if ( $age > |
3 | echo '年龄错误' ; |
4 | exit (); |
5 | } |
6 | ?> |
01 | <?php |
02 | if ( $age > |
03 | // trigger_error('错误信息'[,'错误等级']);这里错误等级为可选项,用于定义该错误的级别 |
04 | // 用户定义的级别包含以下三种:E_USER_WARNING、E_USER_ERROR、E_USER_NOTICE |
05 | trigger_error( '年龄错误' ); // 这里是调用的系统默认的错误处理方式,我们也可以用自定义处理器 |
06 | } |
07 |
08 | /** |
09 | * 自定义处理器,与上面相同 |
10 | */ |
11 | function myerror( $error_level , $error_message ) { |
12 | echo 'error text' ; |
13 | } |
14 |
15 | // 同时需要改变系统默认的处理函数 |
16 | set_error_handler( 'myerror' , // |
17 | // 现在再使用trigger_error就可以使用自定义的错误处理函数了 |
18 | ?> |
01 | <?php |
02 | date_default_timezone_set( 'PRC' ); |
03 | function myerror( $error_level , $error_message ) { |
04 | $info = "错误号:$error_level" ; |
05 | $info .= "错误信息:$error_message" ; |
06 | $info .= '发生时间:' . date ( 'Y-m-d H:i:s' ); |
07 | $filename = 'aa.txt' ; |
08 | if (! $fp = fopen ( $filename , 'a' )) { |
09 | echo '创建文件' . $filename . '失败' ; |
10 | } |
11 | if ( is_writeable ( $filename )) { |
12 | if (!fwrite( $fp , $info )) { |
13 | echo '写入文件失败' ; |
14 | } else { |
15 | echo '已成功记录错误信息' ; |
16 | } |
17 | fclose( $fp ); |
18 | } else { |
19 | echo '文件' . $filename . '不可写' ; |
20 | } |
21 | exit (); |
22 | } |
23 |
24 | set_error_handler( 'myerror' , E_WARNING); |
25 | $fp = fopen ( 'aaa.txt' , 'r' ); |
26 | ?> |
默认的根据php.ini中error_log配置,PHP向服务器的错误记录系统或文件发送错误记录。通过使用error_log()函数可以向文件或远程目的地发送错误记录;
语法:
error_log(error[,type,destination,headers])
type部分一般用3,表示在文件后面追加错误信息,而不会覆盖原内容destination表示目的地,即存放的文件或远程目的地
如:error_log("$error_info",3,"errors.txt");
二、PHP异常处理【重点】
1、基本语法01 | <?php |
02 | try { |
03 | // 可能出现错误或异常的代码 |
04 | //catch |
05 | } $e ) { |
06 | // 对异常处理,方法: |
07 | //1、自己处理 |
08 | //2、不处理,可以再次抛出 |
09 | } |
10 | ?> |
try-使用异常的函数应该位于"try"代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常;
throw-这里规定如何触发异常。每一个"throw"必须对应至少一个"catch";
catch-"catch"代码块会捕获异常,并创建一个包含异常信息的对象;
让我们触发一个异常:
01 | <?php |
02 | /** |
03 | * 创建可抛出一个异常的函数 |
04 | */ |
05 | function checkNum( $number ) { |
06 | if ( $number > |
07 | throw new Exception( "Value ); |
08 | } |
09 |
10 | return true; |
11 | } |
12 |
13 | // |
14 | try { |
15 | checkNum(2); |
16 | // 如果异常被抛出,那么下面一行代码将不会被输出 |
17 | echo 'If ; |
18 | } $e ) { |
19 | // 捕获异常 |
20 | echo 'Message: ' . $e ->getMessage(); |
21 | } |
22 | ?> |
上面代码将获得类似这样一个错误:
1 | Message: |
上面的代码抛出了一个异常,并捕获了它:
创建checkNum()函数,它检测数字是否大于1,如果是,则抛出一个异常。
在"try"代码块中调用checkNum()函数。
checkNum()函数中的异常被抛出。
"catch"代码块接收到该异常,并创建一个包含异常信息的对象($e)。
通过从这个exception对象调用$e->getMessage(),输出来自该异常的错误消息。
[u]不过,为了遵循“每个throw必须对应一个catch”的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。[/u]
[u]set_exception_handler()函数可设置处理所有未捕获异常的用户定义函数。[/u]
01 | <?php |
02 | /** |
03 | * 设置一个顶级异常处理器 |
04 | */ |
05 | function myexception( $e ) { |
06 | echo 'this ; |
07 | } |
08 |
09 | // 修改默认的异常处理器 |
10 | set_exception_handler( "myexception" ); |
11 | try { |
12 | $i = 5; |
13 | if ( $i < |
14 | throw new Exception( '$i ); |
15 | } |
16 | } $e ) { |
17 | // 处理异常 |
18 | echo $e ->getMessage() '<br/>' ; |
19 |
20 | // 不处理异常,继续抛出 |
21 | throw new Exception( 'errorinfo' ); // |
22 | } |
23 | ?> |
01 | <?php |
02 | class customException extends Exception { |
03 | public function errorMessage() { |
04 | $errorMsg = 'Error . $this ->getLine() ' . $this ->getFile() ': <b>' . $this ->getMessage() '</b> ; |
05 | return $errorMsg ; |
06 | } |
07 | } |
08 |
09 | // 使用 |
10 | try { |
11 | throw new customException( 'error message' ); |
12 | } $e ) { |
13 | echo $e ->errorMessage(); |
14 | } |
15 | ?> |
01 | <?php |
02 | try { |
03 | $i = 5; |
04 | if ( $i > |
05 | throw new customException( 'error message' ); // 使用自定义异常类处理 |
06 | } |
07 | if ( $i < |
08 | throw new Exception( 'error2' ); // 使用系统默认异常处理 |
09 | } |
10 | } $e ) { |
11 | echo $e ->getMessage(); |
12 | } $e1 ) { |
13 | echo $e1 ->getMessage(); |
14 | } |
15 | ?> |
需要进行异常处理的代码应该放入try代码块内,以便捕获潜在的异常。
每个try或throw代码块必须至少拥有一个对应的catch代码块。
使用多个catch代码块可以捕获不同种类的异常。
可以在try代码内的catch代码块中再次抛出(re-thrown)异常。
简而言之:如果抛出了异常,就必须捕获它。
相关文章推荐
- PHP中的错误处理、异常处理机制详解
- PHP中的错误处理、异常处理机制
- 细说php的异常和错误处理机制
- PHP错误异常处理详解
- PHP自学之路----错误及异常处理机制、错误日志
- php异常、错误处理机制
- PHP中的错误处理、异常处理机制
- PHP错误异常处理详解【转载】
- PHP错误异常处理详解
- php异常、错误处理机制
- PHP错误异常处理详解
- PHP错误异常处理详解
- PHP异常与错误处理机制
- 函数用户PHP自学之路----错误及异常处理机制、错误日志
- PHP错误和异常详解(PHP7错误处理)
- __autoload && set_hander php的错误异常处理机制以及自动加载机制
- PHP5的异常处理机制[5]--PHP5之前的错误处理--小结
- PHP 5.0异常处理机制深度探索
- PHP如何抛出异常处理错误
- 【Android游戏开发十九】(必看篇)SurfaceView运行机制详解—剖析Back与Home按键及切入后台等异常处理!