PHP基础 错误处理 第十五天



异常处理


 PHP 5 添加了类似于其它语言的异常处理模块。在 PHP 代码中所产生的异常可被   throw 语句抛出并被 catch语句捕获。需要进行异常处理的代码都必须放入 try代码块内,以便捕获可能存在的异常。每一个 try至少要有一个与之对应的 catch。使用多个   catch 可以捕获不同的类所产生的异常。当   try 代码块不再抛出异常或者找不到 catch能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch   的后面继续执行。当然,PHP 允许在 catch代码块内再次抛出(throw)异常。

  当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP   就会尝试查找第一个能与之匹配的 catch。如果一个异常没有被捕获,而且又没用使用   set_exception_handler() 作相应的处理的话,那么 PHP   将会产生一个严重的错误,并且输出   Uncaught Exception … (未捕获异常)的提示信息。


抛出一个异常

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    else return 1/$x;
} 

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
} 

echo 'Hello World'; 

/* 输出的内容
0.2
Caught exception: Division by zero.
Hello World 

*/
?>


嵌套的异常

<?php  

class MyException extends Exception { }  

class Test {
    public function testing() {
        try {
            try {
                throw new MyException('foo!');
            } catch (MyException $e) {
                /* rethrow it */
                throw $e;
            }
        } catch (Exception $e) {
            var_dump($e->getMessage());
        }
    }
}  

$foo = new Test;
$foo->testing();  

/*输出:
  string(4) "foo!" 

*/
?>

common.php

<?php
ini_set('error_reporting',E_ALL&~E_WARING);
error_reporting(E_ALL&~E_WARNING);
//生产环境中为 0
?> 

try.php

<?php 

try{ 

    $fp=fopen('a.txt','r'); 

    if(!$fp){ 

        throw new Exception('文件打开失败');
    } 

    echo '后续代码均不执行'; 

    //exception  $e   $e=new Exception
}catch(Exception $e){ 

    echo $e->getMessage(); 

    echo '<br>是不是进入到这一段来执行了';
} 

?> 

时间和错误

概念:

Unix时间戳     1970.1.1 到现在秒数 最大值为2038年的119

通过time()函数能够得到unix时间戳

Date(时间格式[,unix时间戳]);  如果你不传第二个参数的时候,默认为系统当前时间。

在中国大陆地区,常用时间格式的参数  Y  年  m 两位的月数字表示  d  两位的日 数字表示   H 小时  i 分     s

有其它格式,但是其它格式暂时用不到,你需要的是了解还有其它的。

//1,直接修改php.ini当中的值

//这种方式不推荐使用。

//2,date_default_timezone_set();用上这个函数      

Sleep休眠指定秒数

Usleep休眠指定微秒数

错误异常处理

1, 开发时  让程序人员看到对应的错误

在开发时,我将错误打开。Php.ini当中,错误是默认打开的

2, 运营时  让用户看不到错误提示,但是运维人员能够看到或者收到错误提示

我将错误显示关闭掉

提示类型:

1error   错误   如果发现错误,程序崩溃,停止执行

2, warning警告如果警告,给出提示,会影响到逻辑

3,notice      提醒    看着不爽,效率有些影响【在项目中,连提示都不要有】

如何让用户看不见:

1,@   屏蔽所在行的错误,提示和警告

2,php.ini 设置display_error  on将这个值改为off

3,是设置php.ini当中的error_reporting   E_ALL  &~ E_NOTICE

@符,每行都要使用,看得很不爽,孔子曰:“不爽哉”

在真实项目当中,连notice提示都不要有。

现在的情况是,运营人员并没有把错误记录下来,运维人员也看不到。想办法处理。

1,采用日志的方式来存储   大网站有专门的日志记录服务器,来记录日志

Log_error 将其on  开启

Error_log有三种表示方式:

1, 存储到apache的错误日志中    实现方式,直接留空

2, 将日志存储到系统日志中

3, 是将日志存储到用户自定义的文件中

第一, 必须要改php.ini才能生效

第二, 必须要重启

第三, 服务器当中可能有多个网站,多个网站可能会同时生效。

Ini_set(); 针对当前访问的文件生效php.ini设置,不需要重启,直接设置直接生效,对其他无影响。

ini_set(error_reporting,);  有一个等价的函数  error_reporting();

Ini_get() 直接写上对应的参数就可以,能够获取参数的值

@效率很低

time.php

<?php 

//1,直接修改php.ini当中的值
//
//  这种方式不推荐使用。
//
//2,date_default_timezone_set();用上这个函数
//
//
//3, 在unix时间戳上面+ 8个小时的秒数  $time=time()+(60*60*8);   很2的方式,每次都要加。烦,因此,不使用它 

//  改时区共分三种形式:
//
//  1,直接写 洲别/城市
//  2, 直接写简称  PRC
//  3,Etc/GMT+8 

    echo date('Y-m-d H:i:s',filectime('d:/web/1.php')); 

    date_default_timezone_set('Etc/GMT-8'); 

    echo '北京时间'.date('Y年m月d号 H点i分s秒',time()-(60*60*24)).'<br>'; 

    date_default_timezone_set('America/New_York'); 

    echo '纽约时间'.date('Y年m月d号 H点i分s秒').'<br>'; 

    date_default_timezone_set('Asia/Seoul'); 

    echo '韩国时间'.date('Y年m月d号 H点i分s秒').'<br>'; 

    date_default_timezone_set('Europe/Paris'); 

    echo '巴黎时间'.date('Y年m月d号 H点i分s秒').'<br>';
    date_default_timezone_set('Europe/Berlin'); 

    echo '德国时间'.date('Y年m月d号 H点i分s秒').'<br>';
    date_default_timezone_set('Europe/London'); 

    echo '伦敦时间'.date('Y年m月d号 H点i分s秒').'<br>'; 

    date_default_timezone_set('Australia/Sydney'); 

    echo '悉尼时间'.date('Y年m月d号 H点i分s秒').'<br>'; 

    date_default_timezone_set('Africa/Kampala'); 

    echo '南非时间'.date('Y年m月d号 H点i分s秒').'<br>'; 

$t=mktime(22,0,0,7,8,1983); 

echo date('Y-m-d H:i:s',$t); 

$bir=mktime(22,0,0,7,8,1983); 

$s=time()-$bir; 

//date(); 

?>

checkdate.php

<?php
    if(checkdate(29,2,2011)){
        echo '正确';
    }else{
        echo '错误';
    }
?> 

time.php

<?php
$t=getdate();
var_dump($t);
$t=strtotime('-1 year'); 

echo date('Y-m-d H:i:s',$t); 

//phpinfo(); 

//开始时间 

$start=microtime(true); 

for($i=0;$i<1000;$i++){ 

    time();
    //$_SERVER["REQUEST_TIME"];
} 

//代表在执行
//
//
//sleep(1); 

//结束时间 

$end=microtime(true); 

echo '页面执行时间为'.($end-$start); 

?>