PHP錯誤和異常

目錄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 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();
複製代碼

參考文章

相關文章
相關標籤/搜索