ThinkPHP5.0源碼學習之注冊錯誤和異常處理機制


在base.php文件中,用一句代碼\think\Error::register();實現錯誤和異常處理機制的注冊。
// 注冊錯誤和異常處理機制
\think\Error::register();
 
打開library/think/Error.php,register函數如下:
/**
* 注冊異常處理
* @access public
* @return void
*/
public static function register()
{
    error_reporting(E_ALL);                                 // 設置錯誤級別
    set_error_handler([__CLASS__, 'appError']);             // 設置錯誤處理方式
    set_exception_handler([__CLASS__, 'appException']);     // 設置異常處理
    register_shutdown_function([__CLASS__, 'appShutdown']); // 注冊關閉函數
}
注:set_error_handler("myError") 、set_exception_handler("myException")、register_shutdown_function("myShutdown")不僅可以接受函數,還可以接受類的方法(公開的靜態方法及公開的非靜態方法),但需要以數組形式傳遞,數組的第一個值為“類名”,第二個值為“方法名”。
 
1、error_reporting()
error_reporting() 函數設置當前腳本的錯誤報告級別,規定報告哪種錯誤。E_ALL為顯示所有的錯誤和警告信息,類似的級別還有E_ERROR—運行時致命的錯誤、E_WARNING—運行時非致命的錯誤、E_NOTICE-—運行時的通知。
 
2、set_error_handler()
set_error_handler指定appError來處理系統錯誤,捕獲錯誤后把錯誤以異常的形式拋出。當程序出現錯誤的時候自動調用appError函數,該函數實例化了一個PHP自帶的錯誤異常類ErrorException,如果符合異常處理的,就將錯誤信息以異常的形式拋出來,否則將錯誤信息寫入日志中。
 
3、set_exception_handler()
set_exception_handler指定appException來處理用戶拋出的異常,如果不是異常,就實例化ThrowableError類,將異常包裝起來並拋出。
 
4、register_shutdown_function()
register_shutdown_function指定appShutdown處理超時異常。
 
到此,框架的錯誤和異常處理機制就注冊完了。
 
在注冊錯誤和異常處理機制中,都是使用getExceptionHandler方法來獲取異常處理的實例。
/**
* 獲取異常處理的實例
* @access public
* @return Handle
*/
public static function getExceptionHandler()
{
    static $handle;
 
    if (!$handle) {
        // 異常處理 handle
        $class = Config::get('exception_handle');
 
        if ($class && is_string($class) && class_exists($class) &&
            is_subclass_of($class, "\\think\\exception\\Handle")
        ) {
            $handle = new $class;
        } else {
            $handle = new Handle;
 
            if ($class instanceof \Closure) {
                $handle->setRender($class);
            }
 
        }
    }
 
    return $handle;
}
可以看到 $class = Config::get('exception_handle'); 這句代碼,也就是可以通過修改配置參數來指定新的異常處理對象。
如果想使用自定義的錯誤和異常處理機制,首先在application/config.php文件中找到exception_handle的配置:
// 異常處理handle類 留空使用 \think\exception\Handle
'exception_handle'       => '',
指錯誤信息來自於\think\exception\Handle的方法,將其改為自己定義的Exception類:
// 異常處理handle類 留空使用 \think\exception\Handle
'exception_handle'       => 'thinkphp\library\exception\ExceptionHandler',
再按照配置新建文件,為thinkphp\library\exception\ExceptionHandler.php,重寫這個Handle方法即可:
class ExceptionHandler extends Handle
{
    public function render(Exception $e)
    {
        return json('這里是自定義的錯誤');
        //return parent::render($e); // TODO: Change the autogenerated stub
    }
}
這樣就可以使用自定義的錯誤和異常處理機制了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM