<转>php错误处理和php异常处理机制

php错误处理

当我们开发程序时,有时候程序出现了问题,我们就可以用以下几种办法找出错误。

    开发阶段:开发时输出所有的错误报告,有利于我们进行程序调试
     运行阶段:我们不要让程序输出任何一种错误报告(不能让用户看到(包括懂技术, 不懂技术的人))
 
    将错误报告写入日志中
        一、指定错误报告 error_reporting = E_LL
        二、关闭错误输出 display_errors = Off
        三、开启错误日志功能 log_errors = On

        1. 默认如果不指定错误日志位置,则默认写WEB服务器的日志中
         2. 为error_log选项指定 一个文件名(可写)
         3. 写入到操作系统日志中error_log=syslog

在CODE上查看代码片派生到我的代码片

  1. <span style="font-family:SimSun;font-size:14px;"><?php  
  2. //  error_reporting(E_ALL);  
  3. /// ini_set("display_errors", "off");  
  4. //  ini_set("error_log", "syslog");  
  5. //  ini_set("MAX_FILEUPLOAD", 200000000);  
  6. //  echo ini_get("upload_max_filesize");  
  7. //  error_log("this is a error message!!!!");  
  8.     getType($var);   //注意  
  9.     getType();  //警告  
  10.     getTye();  //错误  会终止程序运行  
  11.     echo "###########################<br>";   
  12. ?></span>  


当然php还提供了函数error_get_last()来获得错误信息

函数定义和用法

该函数以数组的形式返回最后发生的错误。
返回的数组包含 4 个键和值:
[type] - 错误类型
[message] - 错误消息
[file] - 发生错误所在的文件
[line] - 发生错误所在的

在CODE上查看代码片派生到我的代码片

  1. <span style="font-family:SimSun;font-size:14px;"><?php echo $test; print_r(error_get_last()); ?>输出:  
  2. Array ( [type] => 8 [message] => Undefined variable: test [file] => D:\www\test.php [line] => 2 )</span>  

php5.4以后也提供了PHP预定义变量

$php_errormsg — 前一个错误信息

例子:

  1. <?php  
  2. @strpos();  
  3. echo $php_errormsg;  
  4. ?>  


会输出:

Wrong parameter count for strpos()

所以这样我们也很方便了。。。这样是不是对调试程序和排查错误的时候很有帮助呢?

 

这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:

 

常量描述
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 以外。

(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)

php异常处理机制

定义:

异常处理: 意外,是在程序运行过程中发生的意料这外的事,使用异常改变脚本正常流程

语法格式:

  1. <span style="font-family:SimSun;font-size:14px;">try  
  2. //...}  
  3. catch(Exception $e)  
  4. //...}</span>  

PHP中try{}catch{}是异常处理.

将要执行的代码放入TRY块中,如果这些代码执行过程中某一条语句发生异常,则程序直接跳转到CATCH块中,由$e收集错误信息和显示.

PHP中try{}catch{}语句

为了进一步处理异常,我们需要使用PHP中try{}catch{}----包括Try语句和至少一个的catch语句。任何调用 可能抛出异常的方法的代码都应该使用try语句。Catch语句用来处理可能抛出的异常。

我写一段代码:

 

自己定义一个异常类
       作用:就是写一个或多个方法解决当发生这个异常时的处理方式
        1. 自己定义异常类,必须是Exception(内置类)的子类,   可以查看PHP手册里面Exception(内置类)的使用方法
        2. Exception类中的只有构造方法和toString()可以重写, 其它都final

  1. <span style="font-family:SimSun;font-size:14px;"><?php  
  2. class OpenFileException extends Exception {    //继承PHP的内置类  
  3.   
  4.     function __construct($message = null, $code = 0){  
  5.         parent::__construct($message, $code);  
  6.   
  7.         echo "wwwwwwwwwwwwwww<br>";  
  8.     }  
  9.     function open(){  
  10.         touch("tmp.txt");  
  11.   
  12.         $file=fopen("tmp.txt", "r");  
  13.   
  14.         return $file;  
  15.     }  
  16. }  
  17. ?></span>  

 

1. 如果try中代码没有问题,则将try中代码执行完后就到catch后执行
 2. 如果try中代码有异常发生,则抛出一个异常对象(使用throw),抛出给了catch中的参数, 则在try中代码就不会再继续执行下去 直接跳转到catch中去执行, catch中执行完成, 再继续向下执行
     注意: 提示发生了什么异常,这不是主要我们要做事,需要在catch中解决这个异常, 如果解决不了,则出去给用户在下面代码中,如果我没有这个TMP.TXT文件的话,就会抛出异常了。

如果有异常,我们调用OPEN方法就可以解决这个异常了。

  1. <span style="font-family:SimSun;font-size:14px;"><?php  
  2.   
  3. try{  
  4.   
  5.  $file=fopen("tmp.txt", "r");                                                           //  尝试读取这个文件  
  6.   if(!$file)  
  7.             throw new OpenFileException("文件打开失败");       //如果文件不存在则抛出异常  
  8.     
  9. }catch(OpenFileException $e){  //$e =new Exception();  
  10.       
  11.     echo $e->getMessage()."<br>";                                        //getMessage() 是PHP里面内置的方法,可以直接调用  
  12.   
  13.     $file=$e->open();    
  14.   
  15.   
  16. }</span>  

 

下面将代码进行整理以及多个异常处理方法:

    1. <span style="font-family:SimSun;font-size:14px;"><?php  
    2. /*  
    3.  *   异常处理: 意外,是在程序运行过程中发生的意料这外的事,使用异常改变脚本正常流程 
    4.  *   
    5.  *  PHP5中的一个新的重要特性 
    6.  * 
    7.  *  if(){ 
    8.  * 
    9.  *  }else{ 
    10.  * 
    11.  *  } 
    12.  * 
    13.  *  try { 
    14.  * 
    15.  *  }catch(异常对象){ 
    16.  * 
    17.  *  } 
    18.  *   
    19.  *      1. 如果try中代码没有问题,则将try中代码执行完后就到catch后执行 
    20.  *      2. 如果try中代码有异常发生,则抛出一个异常对象(使用throw),抛出给了catch中的参数, 则在try中代码就不会再继续执行下去 
    21.  *          直接跳转到catch中去执行, catch中执行完成, 再继续向下执行 
    22.  * 
    23.  * 
    24.  *      注意: 提示发生了什么异常,这不是主要我们要做事,需要在catch中解决这个异常, 如果解决不了,则出去给用户 
    25.  * 
    26.  *  二、自己定义一个异常类 
    27.  * 
    28.  *      作用:就是写一个或多个方法解决当发生这个异常时的处理方式 
    29.  * 
    30.  *      1. 自己定义异常类,必须是Exception(内置类)的子类, 
    31.  *      2. Exception类中的只有构造方法和toString()可以重写, 其它都final 
    32.  * 
    33.  *  三、处理多个异常 
    34.  * 
    35.  *   
    36.  *  自己定义功能类时如果在方法中抛出异常 
    37.  * 
    38.  * 
    39.  */  
    40.   
    41. class OpenFileException extends Exception {  
    42.   
    43.     function __construct($message = null, $code = 0){  
    44.         parent::__construct($message, $code);  
    45.   
    46.         echo "wwwwwwwwwwwwwww<br>";  
    47.     }  
    48.     function open(){  
    49.         touch("tmp.txt");  
    50.   
    51.         $file=fopen("tmp.txt", "r");  
    52.   
    53.         return $file;  
    54.     }  
    55. }  
    56.   
    57.   
    58. class DemoException extends Exception {  
    59.     function pro(){  
    60.         echo "处理demo发生的异常<br>";  
    61.     }  
    62. }  
    63.   
    64. class TestException extends Exception {  
    65.     function pro(){  
    66.         echo "这里处理test发生的异常<br>";  
    67.     }  
    68. }  
    69.   
    70. class HelloException extends Exception {  
    71.   
    72. }  
    73.   
    74. class MyClass {  
    75.     function openfile(){  
    76.         $file=@fopen("tmp.txt", "r");  
    77.   
    78.         if(!$file)  
    79.             throw new OpenFileException("文件打开失败");  
    80.     }  
    81.   
    82.     function demo($num=0){  
    83.         if($num==1)  
    84.             throw new DemoException("演示出异常");  
    85.     }  
    86.   
    87.     function test($num=0){  
    88.         if($num==1)  
    89.             throw new TestException("测试出错");  
    90.     }  
    91.   
    92.     function fun($num=0){  
    93.         if($num==1)  
    94.             throw new HelloException("###########");  
    95.     }  
    96. }  
    97.   
    98. try{  
    99.     echo "11111111111111<br>";  
    100.   
    101.     $my=new MyClass();  
    102.   
    103.     $my->openfile();  
    104.     $my->demo(0);  
    105.     $my->test(0);  
    106.     $my->fun(1);  
    107.     echo "22222222222222222<br>";  
    108. }catch(OpenFileException $e){  //$e =new Exception();  
    109.       
    110.     echo $e->getMessage()."<br>";  
    111.   
    112.     $file=$e->open();  
    113.   
    114.   
    115. }catch(DemoException $e){  
    116.     echo $e->getMessage()."<br>";  
    117.     $e->pro();  
    118. }catch(TestException $e){  
    119.     echo $e->getMessage()."<br>";  
    120.     $e->pro();  
    121. }catch(Exception $e){  
    122.     echo $e->getMessage()."<br>";  
    123. }  
    124.   
    125.     var_dump($file);  
    126.     echo "444444444444444444444<br>";</span> 

posted on 2015-10-17 11:13  hahahahahai12  阅读(189)  评论(0)    收藏  举报

导航