from :http://lzyy.org/blog/archives/42
對于PHP的異常和錯誤總是有點迷糊,于是花了半個下午的時間,總算是明白了大概。
異常(Exception)是從PHP5開始引入的,一個異常可以通過try{}catch{}的方式,被拋出,被捕獲。異常被拋出后,包含在try里面的異常后面的代碼就不會被執行,然后會去尋找第一個匹配的catch。如果一個異常沒有被捕獲,那么就會觸發PHP Fatal Error,類似:’Uncaught Exception …’。
難免會有意想不到的異常,所以這時就可以使用set_exception_handler()來統一管理。比如下面這段代碼
<?php
function exception_handler($exception) {
echo "Uncaught exception: " , $exception->getMessage(), "\n";
}
set_exception_handler('exception_handler');
throw new Exception('Uncaught Exception');
echo "Not Executed\n";
?>
沒有捕獲拋出的異常,但設置了異常處理函數’exception_handler’,這樣就可以在函數里做文章了,比如顯示一個錯誤頁面,同時記錄下異常的內容,方面日后查看。異常處理函數執行完后,PHP就會停止執行后面的語句。
如果是php內部函數執行時出現異常,不會拋出Exception,而是通過trigger_error來顯示錯誤。好在有set_error_handler,可以設置默認錯誤處理函數,我們在函數里拋出一個異常,這樣就可以達到統一處理的效果。
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new Exception($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
/* Trigger exception */
strpos();
?>
或者直接把異常和錯誤的處理都用一個函數來實現,這樣就需要在函數里判斷錯誤的來源是Exception還是error,可以通過參數個數來判斷(error總是會有5個參數)
設置error
比較重要的兩個參數是:error_reporting和display_errors。在PHP4和PHP5里,error_reporting默認都是E_ALL & ~E_NOTICE(顯示所有的錯誤,但不顯示NOTICE類型的)。但在PHP5里又有了一個新的error類型:E_STRICT,它并沒有被包含到E_ALL里面,所以需要手動添加,如E_ALL | E_STRICT。
注意:下面的代碼里error_reporting是沒有效果的
ini_set("display_errors", 1);
//最后少了一個分號
echo 'hello world'
無論是設置display_errors為0或者1,都沒有效果,因為PHP是先解析后執行,解析過程中出錯,會根據php.ini里的display_errors的設置來決定是否顯示錯誤。可以改為這樣
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("file_with_errors.php");
?>