PHP之錯誤處理詳解
錯誤報告
PHP程式的錯誤發生一般歸屬於下列三個領域:
1、語法錯誤
語法錯誤最常見,並且也容易修復。如:程式碼中遺漏一個分號。這類錯誤會阻止指令碼的執行
2、執行時錯誤
這種錯誤一般不會阻止PHP指令碼的執行,但會阻止當前要做的事情。輸出一條錯誤,但php指令碼繼續執行
3、邏輯錯誤
這種錯誤最麻煩,既不阻止指令碼執行,也不輸出錯誤訊息
[注意]若將php.ini組態檔中的display_errors從預設的on設定為off,將不顯示任何錯誤
在PHP指令碼中可呼叫ini_set()函數,動態設定php.ini組態檔
ini_set("display_errors","On"); //顯示所有錯誤資訊
錯誤級別
實際上,表格中的13個錯誤型別可以分為3類:注意級別、警告級別和錯誤級別。一般地,在開發過程中,忽略注意級別的錯誤
<?php getType($a);//未定義變數,注意級別 echo "1111111111111111<br>"; getType();//未傳入引數,警告級別 echo "222222222222222222222<br>"; getType3();//函數名錯誤,錯誤級別 echo "333333333333333333333<br>"; ?>
錯誤處理
1、第一種錯誤處理方法是修改組態檔
錯誤級別預設為提示所有級別的錯誤:error_reporting = E_ALL
把error_reporting = E_ALL
改為error_reporting = E_ALL & ~E_NOTICE
表示不提示注意級別的錯誤。然後,重新啟動服務生效
error_reporting = E_ALL & ~E_NOTICE
丟擲任何非注意的錯誤,預設值error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR
只考慮致命的執行時錯誤、新解析錯誤和核心錯誤error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)
報告除使用者導致的錯誤之外的所有錯誤
2、第二種錯誤處理方法是使用錯誤處理常式
在PHP指令碼可以通過error_reporting( )函數動態設定錯誤報告級別
<?php error_reporting(E_ALL & ~E_NOTICE); getType($a);//注意級別 echo "1111111111111111<br>"; getType();//警告級別 echo "222222222222222222222<br>"; getType3();//錯誤級別 echo "333333333333333333333<br>";?>
自定義錯誤處理
自定義錯誤報告的處理方式,可以完全繞過標準的PHP錯誤處理常式,這樣就可以按自己定義的格式列印錯誤報告,或改變錯誤報告列印的位置,以下幾種情況可以考慮自定義錯誤處理:1、記下錯誤的資訊,及時發現一些生產環境出現的問題;2、遮蔽錯誤;3、控制錯誤的輸出; 4、作為偵錯工具
使用set_error_handler()函數來設定使用者自定義錯誤處理
<?php //error_reporting(E_ALL & ~E_NOTICE); //在php中註冊一個函數來處理錯誤報告,替代預設的方式 set_error_handler("myerrorfun"); $mess = ""; //自定義錯誤報告處理常式 function myerrorfun($error_type, $error_message, $error_file, $error_line) { global $mess; $mess.="發生錯誤級別為{$error_type}型別, 錯誤訊息<b>{$error_message}</b>, 在檔案<font >{$error_file}</font>中, 第{$error_line}行。<br>"; } getType($a); echo "1111111111111111<br>"; getType(); echo "222222222222222222222<br>"; echo "--------------------------------------------<br>"; echo $mess; ?>
錯誤紀錄檔
一般地,程式都會儲存錯誤紀錄檔,用來記錄程式執行時的錯誤資訊。且錯誤紀錄檔都有其預設的儲存位置。對於錯誤資訊和錯誤紀錄檔的位置,我們都可以進行修改
在PHP.ini組態檔中,有以下幾項可以對錯誤紀錄檔進行設定
error_reporting = E_ALL
//將向PHP傳送每個錯誤display_errors=Off
//不顯示錯誤報告log_errors=On //決定紀錄檔語句記錄的位置
log_errors_max_log=1024
//每個紀錄檔項的最大長度error_log=G:/myerror.log
//指定錯誤寫進的檔案
在php檔案中,我們可以使用函數error_log()來自定義錯誤資訊
<?phperror_log("登入失敗了!");?>
例外處理
異常(Exception)處理用於在指定的錯誤發生時改變指令碼的正常流程,是PHP5中的一個新的重要特性。例外處理是一種可延伸、易維護的錯誤處理機制,並提供了一種新的物件導向的錯誤處理方式
try{
使用try去包含可能會發生異常的程式碼
一旦出現異常try進行捕獲異常,交給catch處理。
丟擲異常語句:throw 異常物件。
}catch(異常物件引數){
在這裡做例外處理。
}[catch(。,,){
.. .. ..
}]
<?php try { $error = 'Always throw this error'; throw new Exception($error); //建立一個異常物件,通過throw語句丟擲 echo 'Never executed'; //從這裡開始,try程式碼塊內的程式碼將不會再被執行 } catch (Exception $e) { echo ‘Caught exception: ’.$e->getMessage()." "; //輸出捕獲的異常訊息 } echo 'Hello World'; //程式沒有崩潰繼續向下執行?>
自定義異常
使用者可以用自定義的例外處理類來擴充套件PHP內建的例外處理類。以下的程式碼說明了在內建的例外處理類中,哪些屬性和方法在子類中是可存取和可繼承的
<?phpclass Exception{ protected $message = 'Unknown exception'; // 異常資訊 private $string; // __toString cache protected $code = 0; // 使用者自定義異常程式碼 protected $file; // 發生異常的檔名 protected $line; // 發生異常的程式碼行號 private $trace; // backtrace private $previous; // previous exception if nested exception public function __construct($message = null, $code = 0, Exception $previous = null); final private function __clone(); // Inhibits cloning of exceptions. final public function getMessage(); // 返回異常資訊 final public function getCode(); // 返回異常程式碼 final public function getFile(); // 返回發生異常的檔名 final public function getLine(); // 返回發生異常的程式碼行號 final public function getTrace(); // backtrace() 陣列 final public function getPrevious(); // 之前的 exception final public function getTraceAsString(); // 已格成化成字串的 getTrace() 資訊 // Overrideable public function __toString(); // 可輸出的字串}?>
[注意]如果使用自定義的類來擴充套件內建例外處理類,並且要重新定義建構函式的話,建議同時呼叫parent::__construct()來檢查所有的變數是否已被賦值。當物件要輸出字串的時候,可以過載__toString() 並自定義輸出的樣式
<?php /* 自定義的一個例外處理類,但必須是擴充套件內例外處理類的子類 */ class MyException extends Exception{ //重定義構造器使第一個引數 message 變為必須被指定的屬性 public function __construct($message, $code=0){ //可以在這裡定義一些自己的程式碼 //建議同時呼叫 parent::construct()來檢查所有的變數是否已被賦值 parent::__construct($message, $code); } public function __toString() { //重寫父類別方法,自定義字串輸出的樣式 return __CLASS__.":[".$this->code."]:".$this->message."<br>"; } public function customFunction() { //為這個異常自定義一個處理方法 echo "按自定義的方法處理出現的這個型別的異常<br>"; } }?>
<?php try { //使用自定義的異常類捕獲一個異常,並處理異常 $error = '允許丟擲這個錯誤'; throw new MyException($error); //建立一個自定義的異常類物件,通過throw語句丟擲 echo 'Never executed'; //從這裡開始,try程式碼塊內的程式碼將不會再被執行 } catch (MyException $e) { //捕獲自定義的異常物件 echo '捕獲異常: '.$e; //輸出捕獲的異常訊息 $e->customFunction(); //通過自定義的異常物件中的方法處理異常 } echo '你好呀'; //程式沒有崩潰繼續向下執行?>
相關參考:php教學
以上就是PHP之錯誤處理詳解的詳細內容,更多請關注TW511.COM其它相關文章!