在php中錯(cuò)誤處理的方法有很多,特別是到了php5之后還提供了專(zhuān)門(mén)的php處理類(lèi),下面我收藏了關(guān)于PHP錯(cuò)誤處理一些方法與程序分享給大家.
在程序中直接判斷,基本的錯(cuò)誤處理:使用 die() 函數(shù),第一個(gè)例子展示了一個(gè)打開(kāi)文本文件的簡(jiǎn)單腳本,代碼如下:
- <?php
- $file=fopen("welcome.txt","r");
- ?>
如果文件不存在,您會(huì)獲得類(lèi)似這樣的錯(cuò)誤:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:webfoldertest.php on line 2
更多詳細(xì)的,代碼如下:
- <?php
- //打開(kāi)一個(gè)文件 未做任何處理
- //$fp =fopen("aa.txt","r");
- //echo "OK";
- //處理:判斷文件是否存在 file_exists
- /*
- if(!file_exists("aa.txt")){
- echo "文件不存在";
- //不存在就退出
- exit(); //退出后,下面面的代碼就不執(zhí)行了
- }else{
- $fp =fopen("aa.txt","r");
- //...操作完之后 關(guān)閉
- fclose($fp);
- }
- echo "OK";
- */
- //PHP處理錯(cuò)誤的3種方法
- //第一種:使用簡(jiǎn)單的die語(yǔ)句
- /* if(!file_exists("aa.txt")){
- die("文件不存在。。。"); //不存在就直接退出
- }else{//開(kāi)源代碼Vevb.com
- $fp =fopen("aa.txt","r");
- //...操作完之后 關(guān)閉
- fclose($fp);
- }
- echo "OK";
- */
- //更簡(jiǎn)單的方式
- file_exists("aa.txt") or die("文件不存在");
- ?>
第二種:錯(cuò)誤處理器 錯(cuò)誤級(jí)別 處理錯(cuò)誤方式,代碼如下:
- <?php
- //
- /*
- 使用error_function(error_level,error_message,
- error_file,error_line,error_context)
- 該函數(shù)必須有能力處理至少兩個(gè)參數(shù) (error level 和 error message),
- 但是可以接受最多五個(gè)參數(shù)(可選的:file, line-number 以及 error context):
- */
- //改寫(xiě)set_error_handler方法
- //如果出現(xiàn) E_WARNING 這個(gè)錯(cuò)誤就調(diào)用my_error 處理方法
- set_error_handler("my_error",E_WARNING);
- set_error_handler("my_error2",E_USER_ERROR);
- //設(shè)置中國(guó)對(duì)應(yīng)的時(shí)區(qū)
- date_default_timezone_set('PRC');
- function my_error($errno,$errmes){
- echo "<font size='5' color='red' >$errno</font>"; //輸出錯(cuò)誤報(bào)告級(jí)別
- echo "錯(cuò)誤信息是:".$errmes;
- exit();
- }
- function my_error2($errno,$errmes){
- //echo "錯(cuò)誤信息是:".$errno,$errmes;
- //exit();
- //把錯(cuò)誤信息輸入到文本中保存已備查看 使用到error_log()函數(shù)
- $message ="錯(cuò)誤信息是:".$errno." ".$errmes;
- error_log(date("Y-m-d G:i:s")."---".$message."rn",3,"myerror.txt"); // rn 表示換行
- }
- //打開(kāi)一個(gè)文件 未做任何處理
- //$fp =fopen("aa.txt","r");
- //echo "OK";
- //使用自定義錯(cuò)誤 要添加觸發(fā)器 這個(gè)trigger_error()函數(shù)來(lái)指定調(diào)用自定義的錯(cuò)誤
- $age=200;
- if($age>150){
- //echo "年齡過(guò)大";
- //調(diào)用觸發(fā)器 同時(shí)指定錯(cuò)誤級(jí)別 這里需要查看幫助文檔
- trigger_error("不好了出大問(wèn)題了",E_USER_ERROR);
- //exit();
- }
- ?>
PHP 異常處理,PHP 5 提供了一種新的面向?qū)ο蟮腻e(cuò)誤處理方法
如果異常沒(méi)有被捕獲,而且又沒(méi)用使用 set_exception_handler() 作相應(yīng)的處理的話,那么將發(fā)生一個(gè)嚴(yán)重的錯(cuò)誤(致命錯(cuò)誤),并且輸出 "Uncaught Exception" (未捕獲異常)的錯(cuò)誤消息.
讓我們嘗試拋出一個(gè)異常,同時(shí)不去捕獲它,代碼如下:
- <?php
- //create function with an exception
- function checkNum($number)
- {
- if($number>1)
- {
- throw new Exception("Value must be 1 or below");
- }
- return true;
- }
- //trigger exception
- checkNum(2);
- ?>
上面的代碼會(huì)獲得類(lèi)似這樣的一個(gè)錯(cuò)誤:
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in C:webfoldertest.php:6 Stack trace: #0 C:webfoldertest.php(12): checkNum(28) #1 {main} thrown in C:webfoldertest.php on line 6Try, throw 和 catch
要避免上面例子出現(xiàn)的錯(cuò)誤,我們需要?jiǎng)?chuàng)建適當(dāng)?shù)拇a來(lái)處理異常.
處理處理程序應(yīng)當(dāng)包括:
1.Try - 使用異常的函數(shù)應(yīng)該位于 "try" 代碼塊內(nèi),如果沒(méi)有觸發(fā)異常,則代碼將照常繼續(xù)執(zhí)行,但是如果異常被觸發(fā),會(huì)拋出一個(gè)異常。
2.Throw - 這里規(guī)定如何觸發(fā)異常,每一個(gè) "throw" 必須對(duì)應(yīng)至少一個(gè) "catch"
3.Catch - "catch" 代碼塊會(huì)捕獲異常,并創(chuàng)建一個(gè)包含異常信息的對(duì)象.
讓我們觸發(fā)一個(gè)異常,代碼如下:
- <?php
- //創(chuàng)建可拋出一個(gè)異常的函數(shù)
- function checkNum($number)
- {
- if($number>1)
- {
- throw new Exception("Value must be 1 or below");
- }
- return true;
- }
- //在 "try" 代碼塊中觸發(fā)異常
- try
- {
- checkNum(2);
- //If the exception is thrown, this text will not be shown
- echo 'If you see this, the number is 1 or below';
- }
- //捕獲異常
- catch(Exception $e)
- {
- echo 'Message: ' .$e->getMessage();
- }
- ?>
上面代碼將獲得類(lèi)似這樣一個(gè)錯(cuò)誤:Message: Value must be 1 or below
創(chuàng)建一個(gè)自定義的 Exception 類(lèi),創(chuàng)建自定義的異常處理程序非常簡(jiǎn)單,我們簡(jiǎn)單地創(chuàng)建了一個(gè)專(zhuān)門(mén)的類(lèi),當(dāng) PHP 中發(fā)生異常時(shí),可調(diào)用其函數(shù),該類(lèi)必須是 exception 類(lèi)的一個(gè)擴(kuò)展.
這個(gè)自定義的 exception 類(lèi)繼承了 PHP 的 exception 類(lèi)的所有屬性,您可向其添加自定義的函數(shù).
我們開(kāi)始創(chuàng)建 exception 類(lèi),代碼如下:
- <?php
- class customException extends Exception
- {
- public function errorMessage()
- {
- //error message
- $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
- .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
- return $errorMsg;
- }
- }
- $email = "someone@example...com";
- try
- {
- //check if
- if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
- {
- //throw exception if email is not valid
- throw new customException($email);
- }
- }
- catch (customException $e)
- {
- //display custom message
- echo $e->errorMessage();
- }
- ?>
這個(gè)新的類(lèi)是舊的 exception 類(lèi)的副本,外加 errorMessage() 函數(shù),正因?yàn)樗桥f類(lèi)的副本,因此它從舊類(lèi)繼承了屬性和方法,我們可以使用 exception 類(lèi)的方法,比如 getLine() 、 getFile() 以及 getMessage().
|
新聞熱點(diǎn)
疑難解答