一下內容純屬于個人筆記
PHP中的異常處理(在沒有關閉php.ini中的錯誤提示下)
在PHP中異常和錯誤是不一樣的,異常是出現正常邏輯之外的情況,而錯誤是指運行時出錯了,比如調用了一個沒有定義的東東!
通常可以使用 ??
try{
}catch(Exception $e){
echo $e->getMessage();
}
但是,這里并不是所有的異常和錯誤都能夠捕獲到的,這里僅僅可以來捕捉有throw拋出的異常,所以如果沒有設置自定義的異常處理,假設直接使用以上那個,是解決不了警告或者致命錯誤的,例如,我需要讀取某一個目錄下的所有文件及目錄
try{
? ? ? ? if($handle = opendir("/home")) { while($file=readdir($handle)){} }catch(Exception $e){}
在這里會出現相應的警告Warning: opendir(/home/huyouheng/.gnupg): failed to open dir: Permission denied in/home/huyouheng/workspace/php/pdo/File.php,權限拒絕
所以在這里自定義一個處理異常的方法
function myErrorHandler(){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? throw new Exception("文件打開失敗", 0); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
這里很簡單的定義了一個拋出異常的方法,然后用函數set_error_handler($this->myErrorHandler()); 或者用set_exception_handler來設置處理錯誤的方法,這個函數一定要放在你的try里面,不然沒有用
try{? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? set_error_handler($this->myErrorHandler());? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $handle = opendir($p); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? while($file=readdir($handler)){} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//............ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }catch(Exception $e){ echo $e->getMessage();}??
這樣的話就會走你自定義異常方法,在捕獲到做相應的處理!一定要被捕獲到,否則也會報錯,方法很多種,自己根據需求進行!
HP7實現了一個全局的throwable接口,于是,PHP7中更多的Error變為可捕獲的Exception返回給開發者,如果不進行捕獲則為Error,如果捕獲就變為一個可在程序內處理的Exception。這些可被捕獲的Error通常都是不會對程序造成致命傷害的Error,比如未定義的東西!
參考文獻:http://php.net/manual/zh/class.exception.php