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


 

posted @ 2017-02-07 09:37  ー個亽の江湖  阅读(81)  评论(0编辑  收藏  举报