目錄php
程序免不了出錯html
以前呢php是報錯,你能夠設置報錯級別,設置錯誤處理函數編程
如今呢,沿着oop的思路,用異常來替代錯誤,異常是比錯誤更加科學和強大的一種處理代碼運行錯誤的一種機制,咱們應該用異常。bash
可是呢,錯誤並無徹底消失匿跡,咱們本身寫的代碼當然能夠用異常,php也在過渡到異常,可是一些老的函數運行出錯仍是會有報錯,大概就是這樣的狀況。app
異常是隨着oop編程而出現的,很是適合oop編程裏使用,看代碼函數
<?php
class Dog{
function eat($food){
if(!is_string($food)){
throw new \Exception('argument must be a string',100);
}
if($food == 'meat'){
return 'i am happy';
}else{
return 'i dont like it';
}
}
}
try{
$dog = new Dog();
$dog->eat(['shit']);
}catch(\Exception $e){
echo $e->getMessage();
}finally{
echo 'we got a exception';
}
//結果是'argument must be a string'
複製代碼
異常的使用步驟有 1.拋出異常 2.try catch 捕捉異常和處理異常oop
拋出異常是一個神奇的操做,用throw,會被外層的catch捕捉。 拋出異常後,代碼就不執行下去了。ui
try代碼塊內有拋出異常的話,就會運行catch代碼塊。spa
Exception類是一個預約義類,拋出異常必須是Exception的實例,接受3個參數,Exception類有好幾個方法,經常使用的有getMessage()和getCode().net
在面向對象編程中,一個類每每專一於一個功能,當出現這個類處理不了的錯誤時,咱們要自覺選擇拋出異常,交給上級去處理
咱們在調用沒底的類進行使用時,要注意放進try代碼塊,來作好錯誤處理
咱們還能夠繼承Exception編寫本身的異常子類,來拋出本身的異常類,catch能夠寫好幾個,這樣能夠經過類名就知道是什麼類型的錯誤,更加細緻得處理不一樣的異常
在catch後面接finally,finally裏面的代碼怎樣都會運行一遍
咱們不可能把全部的代碼都放在try代碼塊,萬一有漏網之魚的異常,就慘了,怎麼辦? 咱們能夠設置一個全局的處理函數做爲後備,當沒有代碼能catch異常時,交給這個函數處理。
這個設置方法就是這樣
set_exception_handler(function(\Exception $e){
echo 'haha,sth is wrong,but i wont tell you the detail,you can go and check log file';
});
throw new \Exception();
複製代碼
錯誤時徹底不同的機制,他沒有太細緻的處理選項,比異常有多一個預約的錯誤等級。
跟異常同樣,咱們也能夠設置一個函數用於處理全部沒有被處理的錯誤。
set_error_handler(function($errno,$errstr,$errfile,$errline){
echo 'haha,sth is wrong,but i wont tell you the detail,you can go and check log file';
});
trigger_error();
複製代碼
咱們能夠巧妙得把錯誤轉發成一個異常,這樣併入異常處理機制統一處理
set_error_handler(function($errno,$errstr,$errfile,$errline){
throw new \Exception($errstr,$errno);
});
trigger_error();
複製代碼
參考文章