PHP基础 错误处理 第十五天

2012-11-08 11:19:49 0  category: 第一阶段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);

?>