PHP錯誤和異常

蜻蜓隊長dragonfly429發表於2019-03-11

目錄

  • 錯誤和異常概念
  • 異常
    • 異常類
    • 丟擲
    • 捕捉
    • 使用原則
    • 全域性設定
  • 錯誤

錯誤和異常

程式免不了出錯

之前呢php是報錯,你可以設定報錯級別,設定錯誤處理函式

現在呢,沿著oop的思路,用異常來替代錯誤,異常是比錯誤更加科學和強大的一種處理程式碼執行錯誤的一種機制,我們應該用異常。

但是呢,錯誤並沒有完全消失匿跡,我們自己寫的程式碼固然可以用異常,php也在過渡到異常,但是一些老的函式執行出錯還是會有報錯,大概就是這樣的情況。

異常

異常是隨著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 捕捉異常和處理異常

丟擲異常

丟擲異常是一個神奇的操作,用throw,會被外層的catch捕捉。 丟擲異常後,程式碼就不執行下去了。

捕捉異常

try程式碼塊內有丟擲異常的話,就會執行catch程式碼塊。

異常類

Exception類是一個預定義類,丟擲異常必須是Exception的例項,接受3個引數,Exception類有好幾個方法,常用的有getMessage()和getCode()

異常機制的使用

單一職責的類,將超出處理範圍的錯誤丟擲

在物件導向程式設計中,一個類往往專注於一個功能,當出現這個類處理不了的錯誤時,我們要自覺選擇丟擲異常,交給上級去處理

呼叫類時,要設定try catch

我們在呼叫沒底的類進行使用時,要注意放進try程式碼塊,來做好錯誤處理

擴充套件Exception

我們還可以繼承Exception編寫自己的異常子類,來丟擲自己的異常類,catch可以寫好幾個,這樣可以通過類名就知道是什麼型別的錯誤,更加細緻得處理不同的異常

finally

在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();
複製程式碼

參考文章

相關文章