中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

更好的PHP錯誤處理

發布時間:2020-04-24 17:21:30 來源:網絡 閱讀:632 作者:shijiaoliang 欄目:web開發

=====錯誤類型====

PHP 主要有兩種錯誤:觸發錯誤和異常。

其中觸發錯誤大概可以分為:編譯錯誤、引擎錯誤和運行時錯誤,其中前兩個是無法捕獲的;

異常都是可以捕獲的,當沒有嘗試捕獲時則會中斷代碼。

觸發錯誤可以通過 error_get_last() 來進行獲得,異常可以使用標準的 try...catch 語句來捕獲。


=====處理方式=====

【錯誤報告】

error_reporting() 函數是 PHP 提供的一個控制錯誤等級的函數,如果設置了對應的錯誤等級,則只會在對應錯誤等級觸發時才會在頁面(或輸出,對于命令行來說)輸出響應的錯誤信息。

error_reporting(int level) 支持等級 level 參數使用二進制的數字來配置錯誤等級,錯誤等級一般用常量來代替對應的二進制標識。例如:E_ALL、E_NOTICE、 E_USER_NOTICE 等等;如果不傳遞參數,則會返回當前的錯誤等級(一般用來保存當前的錯誤等級以供后續恢復)。

其中 E_PARSE、E_COMPILE_* 和 E_CORE_* 是非運行時錯誤,無法被捕獲的


【php.ini】

配置文件是 PHP 初始化的默認配置,通過修改某些參數可以控制對應的初始化參數。如果要控制錯誤,可以通過以下幾個方式來配置:

display_errors - 是否顯示錯誤,一般在生產環境建議關閉該參數并和下列的參數一起試用 log_errors - 記錄錯誤開關,如果打開會記錄到對應位置 error_log - 記錄錯誤日志的位置,不指定為系統默認 error_reporting - 同上面的函數


【錯誤抑制】

PHP 提供了一種特殊的操作,通過在語句前面加上抑制錯誤操作符@來抑制該語句出現錯誤。這種情況通常用于你不知道會發生什么情況下使用,比如打開了不確定的文件或者網絡 URL,但一般不推薦使用

抑制錯誤本身內部做了一系列的處理才達到該效果,并且對于錯誤本身完全是未知的,一般情況下,不建議這么使用


【捕獲異常】

幾乎在所有語言中,都會有對于異常的處理。如果程序拋出一個異常,那么可以通過 try…catch 語句來捕獲該異常,如果明確知道錯誤的類型,也可以只捕獲該類型的錯誤。try…catch 是一種最標準的錯誤處理方式。

try {

  // 代碼部分

} catch (Exception $e) {

  // 根據異常對象對 $e 進行處理

}


【設置錯誤處理器】

PHP 提供了 set_error_handler() 函數來讓開發者傳入一個函數名(或匿名函數,對于 5.2 以上的 PHP)就可以讓所有的錯誤進入該函數,然后開發者可以在函數內進行控制,舉例說明

set_error_handler(function($code, $msg){

  log_error("$msg occur with code $code");

});

對應地,PHP 也提供了 restore_error_handler() 來恢復為標準的 PHP 錯誤控制。


【設置異常處理器】

如果每個異常都去捕獲,顯然是很復雜的事情,需要編寫很多代碼,而且維護起來會比較復雜,對于一個快速編程的語言來說,PHP 自然不會允許發生這種事情。使用 set_exception_handler() 就可以像上面錯誤處理控制器一樣接收所有未捕獲的異常,然后做一些該做的事情,甚至還可以再把錯誤拋出來。例如:

set_exception_handler(function($exception){

  log_error("Exception occur: $exception");

});


【崩潰捕獲】

該類處理并非 PHP 標準的處理方式,但對于某種使程序崩潰的無法捕獲的錯誤確實很有用,它是指注冊一個 shutdown 函數,在函數內通過調用 error_get_last() 來獲取最后的錯誤,并且根據錯誤等級來做相應的處理。

register_shutdown_function(function(){

  $error = error_get_last();

  if ($error && $error['code']()() & error_reporting()) {

    // 崩潰錯誤,記錄日志

  }

});


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清苑县| 安仁县| 榆社县| 永川市| 济宁市| 博乐市| 正安县| 盱眙县| 松原市| 兴文县| 无锡市| 赤城县| 民权县| 灵丘县| 洪泽县| 夹江县| 彰化市| 通辽市| 太仆寺旗| 老河口市| 昌都县| 綦江县| 宜川县| 哈密市| 清水河县| 四子王旗| 阜城县| 无为县| 涞源县| 搜索| 威信县| 兴安县| 河池市| 佳木斯市| 灵台县| 西安市| 峡江县| 阿勒泰市| 涡阳县| 临桂县| 朝阳区|