在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
}
}
這樣就可以使用自定義的錯誤和異常處理機制了。