PHP錯誤處理&異常處理方式小結(jié)
1、錯誤處理的分類
? 語法錯誤: 違背了PHP程序語言的規(guī)則錯誤,稱之為語法錯誤。
? 運行錯誤: 經(jīng)過語法錯誤檢測后,將開始運行 PHP 代碼,在此發(fā)生的錯誤為運行時錯誤。
? 邏輯錯誤: 邏輯錯誤是指程序開發(fā)過程中由于業(yè)務邏輯造成錯誤。
print_r(數(shù)組類型) //沒有以分號結(jié)束語句,報語法錯誤 /* 加載不存在文件 連接數(shù)據(jù)庫失敗 遠程請求失敗 函數(shù)或類不存在 */ require 'request.php'; //因為加載不存在文件,所以會發(fā)生運行時錯誤 echo (10/0); //邏輯錯誤,這IDE都會檢測到,一般都有提示 //邏輯錯誤 for ($i = 0; $i < 5; $i--) { echo $i; }
2、常見錯誤報告類型
值 | 常量 | 描述 |
---|---|---|
1 | E_ERROR | 致命的運行時錯誤。這類錯誤一般是不可恢復的情況,例如內(nèi)存分配導致的問題。后果是導致腳本終止不再繼續(xù)運行 |
2 | E_WARNING | 運行時警告 (非致命錯誤)。僅給出提示信息,但是腳本不會終止運行。 |
8 | E_NOTICE | 運行時通知。表示腳本遇到可能會表現(xiàn)為錯誤的情況。 |
64 | E_COMPILE_ERROR | 致命編譯時錯誤。類似 E_ERROR |
2048 | E_STRICT | 啟用 PHP 對代碼的修改建議,以確保代碼具有最佳的互操作性和向前兼容性。 |
8192 | E_DEPRECATED | 運行時通知。啟用后將會對在未來版本中可能無法正常工作的代碼給出警告。 |
8191 | E_ALL | 所有錯誤和警告,除級別 E_STRICT 以外。 |
注意:修改 php.ini
配置文件, display_errors = On
即開啟或者關(guān)閉錯誤顯示。
關(guān)閉警告與致命錯誤
error_reporting(~E_WARNING & ~E_COMPILE_ERROR); require('a');
顯示除通知外的所有錯誤
error_reporting(E_ALL & ~E_NOTICE); echo $arrays;
關(guān)閉錯誤顯示
error_reporting(0);
3、異常處理
基本語法:
try{ //邏輯代碼 }catch(){ //捕獲異常時候的處理 }
注意: 需要手動拋出異常,這與其他語言不同,異常使用 try…cache 觸發(fā)。
手動拋出異常的方法:
throw new 錯誤類型($message, $code);
注意:可以設(shè)置多個catch,參數(shù)Exception 或者繼承Exception的類
Exception 類的方法:
方法 | 說明 | 重寫 |
---|---|---|
getFile | 產(chǎn)生異常錯誤的文件 | NO,final |
getCode | 錯誤碼 | NO,final |
getLine | 錯誤行號 | NO,final |
getMessage | 錯誤消息 | NO,final |
__toString | 對象轉(zhuǎn)字符串后輸出內(nèi)容 | YES |
finally: 需要放在 catch
后,finally
無論是否拋出異常都會執(zhí)行。
登錄異常處理的例子:
class LoginException extends Exception { // 構(gòu)造函數(shù) public function __construct($message, $code = 0, Throwable $previous = null) { parent::__construct($message, $code, $previous); } // 將異常對象轉(zhuǎn)為字符串 public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; } // 自定義異常處理函數(shù) public function logError() { // 記錄登錄錯誤日志 error_log("登錄異常: " . $this->getMessage()); } } function loginUser($username, $password) { // 模擬登錄邏輯 if ($username !== "admin" || $password !== "password") { throw new LoginException("無效的用戶名或密碼。"); } // 登錄成功 return true; } try { $loggedIn = loginUser("guest", "pass123"); // 嘗試登錄 if ($loggedIn) { echo "登錄成功!"; } } catch (LoginException $e) { // 捕獲登錄異常 echo "登錄失?。? . $e->getMessage() . "\n"; $e->logError(); // 調(diào)用自定義異常處理函數(shù),記錄登錄錯誤日志 } catch (Exception $e) { // 捕獲其他異常 echo "發(fā)生了一個錯誤:" . $e->getMessage() . "\n"; }
操作數(shù)據(jù)庫多表聯(lián)動時捕獲異常回滾數(shù)據(jù):
try { // 連接數(shù)據(jù)庫 $db = new PDO("mysql:host=localhost;dbname=mydatabase", "username", "password"); // 開始事務 $db->beginTransaction(); // 執(zhí)行一系列數(shù)據(jù)庫操作 $db->exec("INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com')"); $db->exec("INSERT INTO orders (user_id, product_id, quantity) VALUES (1, 1, 2)"); // 提交事務 $db->commit(); } catch (PDOException $e) { // 捕獲 PDO 異常 // 回滾事務 $db->rollBack(); // 記錄異常日志 error_log("數(shù)據(jù)庫操作異常: " . $e->getMessage()); // 輸出錯誤信息 echo "發(fā)生了一個數(shù)據(jù)庫操作異常:" . $e->getMessage() . "\n"; }
總結(jié):
異常處理應該是有針對性的:捕獲和處理那些你知道如何處理的異常類型,而將未知或不可處理的異常傳遞給更上層的代碼進行處理。
使用合適的異常類型:PHP 中有許多內(nèi)置的異常類型,如
Exception
、InvalidArgumentException
、RuntimeException
等。選擇合適的異常類型可以更好地組織和識別代碼中的異常情況。按照異常類型的順序進行捕獲:在
catch
塊中,應該按照特定異常類型到更一般異常類型的順序進行排序。這樣可以確保異常被正確捕獲,并且避免特定的異常被更一般的異常類型捕獲導致無法執(zhí)行特定的異常處理邏輯。使用多個
catch
塊進行處理:根據(jù)不同的異常類型,使用多個catch
塊來處理不同類型的異常。這樣可以更細粒度地處理異常,并根據(jù)需要執(zhí)行特定的邏輯。考慮添加日志或錯誤記錄:在異常處理過程中,可以將異常信息記錄到日志文件或錯誤日志中,以便后續(xù)的故障排查和分析。
避免過度捕獲異常:不要過度捕獲異常,這可能導致隱藏潛在的問題或掩蓋錯誤。只捕獲你知道如何處理的異常,并將其他未處理的異常傳遞給更上層的代碼進行處理。
使用
finally
塊(可選):finally
塊中的代碼無論是否發(fā)生異常都會執(zhí)行。它通常用于釋放資源或執(zhí)行清理操作,以確保在異常發(fā)生時資源得到正確處理。拋出自定義異常:通過定義自定義異常類,可以更好地組織和標識特定類型的異常。這樣可以使代碼更加清晰,并提供更豐富的異常信息。
PHP常見問題合集開發(fā)中的錯誤處理與日志記錄
本文將總結(jié)常見的PHP開發(fā)問題,并提供錯誤處理和日志記錄的解決方案。
一、PHP開發(fā)中的常見問題
語法錯誤:在PHP開發(fā)中,常常會出現(xiàn)拼寫錯誤、缺少分號等語法錯誤。這些錯誤會導致程序無法正常執(zhí)行。為了解決這些問題,我們應該養(yǎng)成良好的編碼習慣,并且在開發(fā)過程中使用代碼編輯器的自動補全和語法檢查功能。
變量未定義或未初始化:在PHP中,如果使用未定義或未初始化的變量,會導致警告或致命錯誤。為了避免這種問題,應該始終在使用變量之前對其進行初始化或定義。
函數(shù)不存在或參數(shù)錯誤:在調(diào)用函數(shù)時,如果函數(shù)不存在或者傳遞了錯誤的參數(shù),會導致程序無法正常執(zhí)行。為了解決這些問題,應該對函數(shù)的存在進行檢查,并確保傳遞正確的參數(shù)。
數(shù)據(jù)庫連接問題:在使用PHP開發(fā)Web應用程序時,經(jīng)常會涉及到與數(shù)據(jù)庫的連接。如果連接失敗或出現(xiàn)其他問題,會導致無法正常訪問或操作數(shù)據(jù)庫。為了解決這些問題,應該確保數(shù)據(jù)庫的配置正確,并使用try-catch語句捕獲異常。
文件訪問權(quán)限問題:在PHP開發(fā)中,經(jīng)常需要讀取或?qū)懭胛募H绻募脑L問權(quán)限不正確,會導致無法讀取或?qū)懭胛募?。為了解決這些問題,應該確保文件有足夠的訪問權(quán)限,并在操作文件時進行錯誤處理。
二、錯誤處理的方法
錯誤報告設(shè)置:在開發(fā)環(huán)境中,應該將PHP的錯誤報告級別設(shè)置為E_ALL,以便能夠捕獲所有錯誤。在生產(chǎn)環(huán)境中,應該將錯誤報告級別設(shè)置為E_ALL & ~E_NOTICE,以避免顯示一些無關(guān)緊要的通知。
異常處理:在PHP中,可以使用try-catch語句來捕獲異常并進行處理。在拋出異常時,應該提供有意義的錯誤消息,并在catch塊中進行相應的處理,例如記錄日志或顯示錯誤信息給用戶。
自定義錯誤處理函數(shù):可以使用set_error_handler()函數(shù)來設(shè)置自定義的錯誤處理函數(shù)。在該函數(shù)中,可以定義錯誤消息的輸出方式,例如將錯誤消息寫入日志文件或發(fā)送郵件通知。
三、日志記錄的方法
使用日志庫:PHP中有許多開源的日志庫,例如Monolog和Log4php。通過使用這些庫,可以方便地將錯誤信息寫入文件、數(shù)據(jù)庫或其他目標。
日志級別設(shè)置:在日志記錄中,可以設(shè)置不同的日志級別,如DEBUG、INFO、WARNING、ERROR和CRITICAL等。根據(jù)不同的情況,可以選擇記錄不同級別的日志信息。
日志分割和歸檔:為了避免日志文件過大,可以使用日志分割和歸檔功能。通過使用日志庫提供的工具,可以按照時間或文件大小等條件,將日志文件分割成多個文件,并進行歸檔。
總結(jié)起來,開發(fā)中會遇到各種PHP問題,如語法錯誤、變量未定義、函數(shù)不存在、數(shù)據(jù)庫連接問題和文件訪問權(quán)限問題等。為了解決這些問題,可以使用錯誤處理和日志記錄的方法。錯誤處理包括設(shè)置錯誤報告、使用異常處理和自定義錯誤處理函數(shù)。日志記錄包括使用日志庫、設(shè)置日志級別和實現(xiàn)日志分割和歸檔等。通過合理使用這些方法,可以提高代碼的質(zhì)量和可維護性,從而改善開發(fā)效率和用戶體驗。
相關(guān)文章
PHP實現(xiàn)word轉(zhuǎn)pdf的兩種方式(有用!)
最近遇到一個需求,將word文件轉(zhuǎn)換成pdf,輾轉(zhuǎn)了一上午終于搞定了,下面這篇文章主要給大家介紹了關(guān)于PHP實現(xiàn)word轉(zhuǎn)pdf的兩種方式,需要的朋友可以參考下2022-09-09無JS,完全php面向過程數(shù)據(jù)分頁實現(xiàn)代碼
無JS,完全php面向過程數(shù)據(jù)分頁實現(xiàn)代碼,需要的朋友可以參考下2012-08-08PHP var關(guān)鍵字相關(guān)原理及使用實例解析
這篇文章主要介紹了PHP var關(guān)鍵字相關(guān)原理及使用實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07php smarty 二級分類代碼和模版循環(huán)例子
分享下最近寫的smarty模版引擎輸出二級分類代碼,主要是靠二維數(shù)組進行控制輸出。2011-06-06PHP中soap用法示例【SoapServer服務端與SoapClient客戶端編寫】
這篇文章主要介紹了PHP中soap用法,結(jié)合實例形式分析了SoapServer服務端與SoapClient客戶端相關(guān)實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下2018-12-12php實現(xiàn)Mongodb自定義方式生成自增ID的方法
這篇文章主要介紹了php實現(xiàn)Mongodb自定義方式生成自增ID的方法,實例分析了Mongodb自增字段的實現(xiàn)技巧與對應php操作方法,需要的朋友可以參考下2015-03-03php+Ajax處理xml與json格式數(shù)據(jù)的方法示例
這篇文章主要介紹了php+Ajax處理xml與json格式數(shù)據(jù)的方法,結(jié)合實例形式分析了ajax處理xml格式數(shù)據(jù)及json格式數(shù)據(jù)相關(guān)操作技巧與注意事項,需要的朋友可以參考下2019-03-03