摘要:有自身的錯(cuò)誤捕獲級(jí)別,默認(rèn),且不受設(shè)定的級(jí)別的影響。捕獲錯(cuò)誤異常捕獲異常捕獲類型錯(cuò)誤返回值參數(shù)類型不正確嚴(yán)格模式下更容易出現(xiàn)捕獲解析錯(cuò)誤語(yǔ)法錯(cuò)誤除無法捕獲但除取余可以捕獲很無奈基本錯(cuò)誤這里要注意的是,在中依然無法隱式的完美捕獲。
PHP(PHP_VERSION >= 7) 的 Error / Exception 的捕獲與處理還是值得一說的,優(yōu)雅處理錯(cuò)誤與異常,在提升框架友好度的同時(shí),也提升了開發(fā)效率。
PHP 錯(cuò)誤等級(jí)# 系統(tǒng)級(jí)用戶代碼的一些錯(cuò)誤類型 可由 try ... catch ... 捕獲 E_PARSE 解析時(shí)錯(cuò)誤 語(yǔ)法解析錯(cuò)誤 少個(gè)分號(hào) 多個(gè)逗號(hào)一類的 致命錯(cuò)誤 E_ERROR 運(yùn)行時(shí)錯(cuò)誤 比如調(diào)用了未定義的函數(shù)或方法 致命錯(cuò)誤 # 系統(tǒng)級(jí)用戶代碼的一些錯(cuò)誤類型 可由 set_error_handler 捕獲處理 E_WARNING 運(yùn)行時(shí)警告 調(diào)用了未定義的變量 E_NOTICE 運(yùn)行時(shí)提醒 E_DEPRECATED 運(yùn)行時(shí)已廢棄的函數(shù)或方法 # 用戶級(jí)自定義錯(cuò)誤 可由 trigger_error 觸發(fā) 可由 set_error_handler 捕獲處理 E_USER_ERROR 用戶自定義錯(cuò)誤 致命錯(cuò)誤 未處理也會(huì)導(dǎo)致程序退出 E_USER_WARNING E_USER_NOTICE E_USER_DEPRECATED ==========================開發(fā)中常遇到/不常遇到分割線======================= # Zend Engine 內(nèi)部的一些錯(cuò)誤 應(yīng)該也能通過 try ... catch ... 捕獲 略難測(cè)試 E_CORE_ERROR E_CORE_WARNING E_COMPILE_ERROR E_COMPILE_WARNING #編碼標(biāo)準(zhǔn)化警告(建議如何修改以向前兼容) E_STRICT 部分 try ... catch ... 部分 set_error_handler E_RECOVERABLE_ERROR
以上為 PHP 的一些錯(cuò)誤監(jiān)聽級(jí)別,常用于 error_reporting 和 set_error_handler 的監(jiān)聽級(jí)別設(shè)定。
PHP 的錯(cuò)誤處理其實(shí)可以分為:用戶自定義錯(cuò)誤處理 和 PHP標(biāo)準(zhǔn)錯(cuò)誤處理,兩者的關(guān)系相當(dāng)于兩層錯(cuò)誤捕捉器,系統(tǒng)會(huì)先檢測(cè)是否定義了 用戶自定義錯(cuò)誤處理,否則會(huì)將錯(cuò)誤交由 PHP標(biāo)準(zhǔn)錯(cuò)誤處理 進(jìn)行處理。
注意:PHP 的所有的 Exception 都屬于 E_ERROR 級(jí)的錯(cuò)誤,拋出時(shí)如果沒有被捕獲而交由 PHP 標(biāo)準(zhǔn)錯(cuò)誤處理的話,就會(huì) Fatal Error 導(dǎo)致程序退出執(zhí)行。當(dāng)然,PHP7 為了細(xì)化錯(cuò)誤級(jí)別,劃分了 Error 級(jí) Error 的衍生類,這些也都屬于 E_ERROR 級(jí)別的錯(cuò)誤。
PHP 標(biāo)準(zhǔn)錯(cuò)誤處理PHP 標(biāo)準(zhǔn)錯(cuò)誤處理是在一些錯(cuò)誤沒有被用戶捕獲處理(沒有被 try ... catch ... 或 set_error_handler 捕獲處理)時(shí),錯(cuò)誤 會(huì)遞交至 PHP 標(biāo)準(zhǔn)錯(cuò)誤處理。相關(guān)的設(shè)置項(xiàng)如下:
1、error_reporting([level])獲取或設(shè)定當(dāng)前錯(cuò)誤的監(jiān)聽級(jí)別。要注意,是獲取或設(shè)定的 PHP 標(biāo)準(zhǔn)錯(cuò)誤處理 的級(jí)別,不會(huì)有效于 try...catch... 或 set_error_handler。
2、display_errors是否將錯(cuò)誤信息回顯至標(biāo)準(zhǔn)輸出。默認(rèn)開啟,生產(chǎn)環(huán)境下強(qiáng)烈建議 關(guān)閉 此項(xiàng)。
3、log_errors是否記錄錯(cuò)誤日志。默認(rèn)關(guān)閉,生產(chǎn)環(huán)境下強(qiáng)烈建議 開啟 此項(xiàng)。
4、error_log錯(cuò)誤日志的保存文件。注意:如果路徑無效,display_errors 會(huì)被強(qiáng)制開啟。
PHP 用戶自定義錯(cuò)誤處理 1、set_error_handlerset_error_handler 并非可以捕獲所有錯(cuò)誤,且 set_error_handler 不會(huì)終止程序繼續(xù)執(zhí)行。處理后若返回 false,則錯(cuò)誤會(huì)被繼續(xù)遞交給 PHP 標(biāo)準(zhǔn)錯(cuò)誤處理 流程。
可以捕獲: E_WARNING & E_NOTICE & E_DEPRCATED & E_USER_* & 部分 E_STRICT 級(jí)的錯(cuò)誤。
無法捕獲: E_ERROR & E_PARSE & E_CORE_* & E_COMPLIE_* 級(jí)的錯(cuò)誤。有自身的錯(cuò)誤捕獲級(jí)別,默認(rèn)E_ALL | E_STRICT,且不受 error_reporting 設(shè)定的級(jí)別的影響。這里要理解,用戶自定義錯(cuò)誤處理 和 PHP 標(biāo)準(zhǔn)錯(cuò)誤處理 是兩層錯(cuò)誤捕捉器,有獨(dú)立的捕獲級(jí)別。
2、trigger_errortrigger_error 用來觸發(fā)用戶級(jí)別的自定義錯(cuò)誤,可以使用 set_error_handler 捕獲處理。
默認(rèn)的錯(cuò)誤級(jí)別是 E_USER_NOTICE,我們可以自定義。
這里需要注意的是:E_USER_ERROR 級(jí)別的錯(cuò)誤如果被 PHP 標(biāo)準(zhǔn)錯(cuò)誤處理 捕獲,腳本也會(huì)退出執(zhí)行錯(cuò)誤。3、set_exception_handlerset_exception_handler 用戶自定義捕獲異常 handler,異常沒有被 try ... catch 捕獲處理的話會(huì)被拋出,此時(shí)系統(tǒng)會(huì)檢查上下文是否注冊(cè)了 set_exception_handler。
如果未注冊(cè) 則進(jìn)入 PHP 標(biāo)準(zhǔn)錯(cuò)誤處理 致命錯(cuò)誤退出執(zhí)行。
如果已注冊(cè) 則進(jìn)入 set_exception_handler 處理 程序依然會(huì)退出執(zhí)行。
而 try ... catch ... 捕獲異常后仍不會(huì)退出執(zhí)行,故強(qiáng)烈建議將有異常的執(zhí)行邏輯放入 try ... catch 中4、try ... catch ...開發(fā)中用戶層面的 set_error_hanlder 無法捕獲的錯(cuò)誤還剩下 E_ERROR 和 E_PARSE 兩個(gè)級(jí)別,使用 try ... catch ... 則可以將這倆貨捕捉到。
來個(gè)小插曲:大家對(duì) E_PARSE 熟悉又陌生,可能經(jīng)常遇到(各大框架都有此級(jí)別錯(cuò)誤捕獲提示),但自己不知道如何捕獲,其實(shí)首先要理解 E_PARSE 錯(cuò)誤的發(fā)生時(shí)段。
E_PARSE:即語(yǔ)法解析錯(cuò)誤,Syntax Error then Parse Error,PHP 將腳本載入 Zend Engine 后,最開始要做的就是檢查基本語(yǔ)法是否有誤,無誤才會(huì)調(diào)用解釋器,一行行的開始解釋運(yùn)行。
這里就有個(gè)雞生蛋,蛋生雞的問題了。如下代碼:
然后很多人會(huì)詫異,明明關(guān)閉了錯(cuò)誤提示,為什么還會(huì)報(bào)錯(cuò)?
沒錯(cuò),代碼的確正確的書寫了關(guān)閉錯(cuò)誤提示的意圖。但還沒被執(zhí)行到時(shí),腳本就因?yàn)樽畛跏嫉恼Z(yǔ)法解析錯(cuò)誤,被 Zend Engine 拋出 Parse Error 終止執(zhí)行了。同時(shí)還要理解,PHP include / require 只有在真的解釋到這一行代碼時(shí),引用的文件才會(huì)被載入--解析--解釋執(zhí)行。
所以,我們需要有一個(gè)無錯(cuò)的 try ... catch ... 容器,在容器中便可以對(duì)后續(xù)引用的外部腳本進(jìn)行 E_PARSE 錯(cuò)誤捕捉。
例如框架自身是一個(gè)無錯(cuò)的運(yùn)行容器,開發(fā)者自寫的 MVC 是被 include / require 到此容器中 解析 -- 解釋執(zhí)行 的,用戶代碼的語(yǔ)法錯(cuò)誤即會(huì)被容器的 try ... catch ... 優(yōu)雅的捕獲到。
try ... catch ... 的錯(cuò)誤捕獲級(jí)別同樣不受 error_reporting 影響,我們可以通過 多層 catch 細(xì)化各類型的錯(cuò)誤。
這里要注意的是,DivisionByZeroError 在 PHP7 中依然無法隱式的完美捕獲。準(zhǔn)確的說:
當(dāng) x / 0 時(shí)拋出一個(gè) E_WARNING 級(jí)別的錯(cuò)誤,我們可以 set_error_handler 捕獲,然后再判斷錯(cuò)誤為
"Devision by zero" 時(shí)拋出一個(gè) ErrorException 的異常交由 try ... catch ... 捕獲處理即可。當(dāng) x % 0 時(shí)才會(huì)直接拋出 DivisionByZeroError 的錯(cuò)誤。
或者使用 intdiv(x, 0) 來代替 x / 0,會(huì)自動(dòng)拋出 DivisionByZeroError當(dāng)然,你也可以顯示的判斷除數(shù)為 0 來決定是否拋出個(gè) DivisionByZeroError
PHP 預(yù)定義的 Error 和 ExceptionPredefined Exceptions 預(yù)定義異常 可由系統(tǒng)自動(dòng)拋出
http://php.net/manual/en/rese...Exception
ErrorException
Error
ArgumentCountError
ArithmeticError
AssertionError
DivisionByZeroError
ParseError
TypeErrorSPL Exceptions SPL 標(biāo)準(zhǔn)規(guī)范異常 可供開發(fā)者規(guī)范代碼自行拋出
http://php.net/manual/en/spl....BadFunctionCallException完善的錯(cuò)誤和異常捕獲
BadMethodCallException
DomainException
InvalidArgumentException
LengthException
LogicException
OutOfBoundsException
OutOfRangeException
OverflowException
RangeException
RuntimeException
UnderflowException
UnexpectedValueException下面的代碼基本呈現(xiàn)和捕獲了 PHP7 提供的所有預(yù)定義錯(cuò)誤和異常 及 PHP 標(biāo)準(zhǔn)錯(cuò)誤處理
1、使用 try ... catch 捕獲 E_ERROR 及 E_PARSE 級(jí)別的 Error (及Error 類的衍生類) 和 Exception (ErrorException)。
2、對(duì)于 try ... catch 無法捕獲的 E_WARNING,E_NOTICE,E_DEPRECATED,E_USER_*,部分 E_STRICTED 級(jí)別的錯(cuò)誤,我們使用 set_error_handler 捕獲處理,捕獲后我們其實(shí)可以將錯(cuò)誤信息封裝到 ErrorException 中并拋出,這樣處理流又會(huì)交給 try ... catch,可以統(tǒng)一處理,比如Yii2框架就是這樣處理的。
3、set_exception_handler 則是捕獲在沒有 try ... catch 中執(zhí)行的代碼的異常,所以強(qiáng)烈建議一些存在異常 風(fēng)險(xiǎn)的邏輯要放入 try ... catch 中。= 7 // PHP 標(biāo)準(zhǔn)錯(cuò)誤處理 捕獲級(jí)別 error_reporting(E_ALL); // 是否將 標(biāo)準(zhǔn)錯(cuò)誤處理 捕獲的錯(cuò)誤回顯在 stdout 上 ini_set("display_errors", false); // 開啟錯(cuò)誤日志 ini_set("log_errors", true); // 如果錯(cuò)誤日志路徑無效 display_errors 依然會(huì)強(qiáng)制打開 ini_set("error_log", __DIR__ . "/php-errors.log"); /** * set_error_handler 用戶自定義錯(cuò)誤 handler * 能夠捕獲 E_WARNING E_NOTICE E_DEPRECATED E_USER_* E_STRICT 級(jí)的錯(cuò)誤 * 無法捕獲 E_ERROR E_PARSE E_CORE_* E_COMPILE_* [DivisionByZeroError TypeError] 級(jí)的錯(cuò)誤 */ set_error_handler(function ($error_no, $error_msg, $error_file, $error_line) { switch ($error_no) { case E_WARNING: // x / 0 錯(cuò)誤 PHP7 依然不能很友好的自動(dòng)捕獲 只會(huì)產(chǎn)生 E_WARNING 級(jí)的錯(cuò)誤 // 捕獲判斷后 throw new DivisionByZeroError($error_msg) // 或者使用 intdiv(x, 0) 方法 會(huì)自動(dòng)拋出 DivisionByZeroError 的錯(cuò)誤 if (strcmp("Division by zero", $error_msg) == 0) { throw new DivisionByZeroError($error_msg); } $level_tips = "PHP Warning: "; break; case E_NOTICE: $level_tips = "PHP Notice: "; break; case E_DEPRECATED: $level_tips = "PHP Deprecated: "; break; case E_USER_ERROR: $level_tips = "User Error: "; break; case E_USER_WARNING: $level_tips = "User Warning: "; break; case E_USER_NOTICE: $level_tips = "User Notice: "; break; case E_USER_DEPRECATED: $level_tips = "User Deprecated: "; break; case E_STRICT: $level_tips = "PHP Strict: "; break; default: $level_tips = "Unkonw Type Error: "; break; } // do some handle $error = $level_tips . $error_msg . " in " . $error_file . " on " . $error_line; echo $error . PHP_EOL; // or throw a ErrorException back to try ... catch block // throw new ErrorException($error); // 如果 return false 則錯(cuò)誤會(huì)繼續(xù)遞交給 PHP 標(biāo)準(zhǔn)錯(cuò)誤處理 // return false; }, E_ALL | E_STRICT); /** * set_exception_handler 用戶自定義捕獲異常 handler * 異常沒有被 try ... catch ... 捕獲處理的話會(huì)被拋出 * 此時(shí)系統(tǒng)會(huì)檢查上下文是否注冊(cè)了 set_exception_handler * 如果未注冊(cè) 則進(jìn)入 PHP 標(biāo)準(zhǔn)異常處理 致命錯(cuò)誤退出執(zhí)行 * 如果已注冊(cè) 則進(jìn)入 set_exception_handler 處理 程序依然會(huì)退出執(zhí)行 * 而 try ... catch ... 捕獲異常后仍不會(huì)退出執(zhí)行 * 故強(qiáng)烈建議將有異常的執(zhí)行邏輯放入 try ... catch 中 */ set_exception_handler(function ($exception) { echo $exception; // 此處程序會(huì)退出執(zhí)行 異常到此結(jié)束 并不會(huì)交給 PHP 標(biāo)準(zhǔn)異常處理 }); // type error demo function foo(int $bar): int { return "result type error"; } // 捕獲 E_ERROR E_PARSE 級(jí)的 Error // 捕獲 Exception try { // 加載外部文件的正確寫法 $file = __DIR__ . "/bar.inc.php"; if (file_exists($file)) { require_once $file; } else { throw new Exception($file . " not exists!"); } // ParseError 解析錯(cuò)誤 // bar.inc.php 的內(nèi)容要有基本的語(yǔ)法錯(cuò)誤: = 7.1.0 // strlen 參數(shù)錯(cuò)誤 echo strlen("hello world", 4); // TypeError 類型錯(cuò)誤 // foo 要求的參數(shù)為整形,傳遞了字符串 // 返回類型為 int 但 return 了 string 類型錯(cuò)誤 foo("type error"); // DivisionByZeroError extends ArithmeticError // x / 0 會(huì)拋出 E_WARNING 的異常 但不會(huì)自動(dòng)拋出 DivisionByZeroError // 我們可以使用 set_error_handler 進(jìn)行捕獲然后手動(dòng)拋出 DivisionByZeroError 1 / 0; // Integer Divison 等同于 1 / 0 可以直接拋出 DivisionByZeroError intdiv(1, 0); // 除 0 取余 可以直接拋出 DivisionByZeroError 1 % 0; // ArithmeticError 錯(cuò)誤 intdiv(PHP_INT_MIN, -1); // AssertionError 斷言錯(cuò)誤 assert("1 != 1"); // 調(diào)用未定義的函數(shù) 錯(cuò)誤級(jí)別:E_ERROR bar(); } catch (ErrorException $errorException) { // 錯(cuò)誤異常 // 最常用的就是將那幾個(gè)非致命的錯(cuò)誤捕獲后 ErrorException 回拋到 try ... catch 中 echo "ErrorException: " . $errorException . PHP_EOL; } catch (Exception $exception) { // 基本異常 echo "Exception: " . $exception . PHP_EOL; } catch (ParseError $parseError) { // 解析錯(cuò)誤 語(yǔ)法錯(cuò)誤 echo "Parse Error: " . $parseError . PHP_EOL; } catch (ArgumentCountError $argumentCountError ) { // 傳參非法錯(cuò)誤 php >= 7.1.0 echo "Argument Count Error: " . $argumentCountError . PHP_EOL; } catch (TypeError $typeError) { // 類型錯(cuò)誤 返回值 echo "Type Error: " . $typeError . PHP_EOL; } catch (DivisionByZeroError $divisionByZeroError) { // x / 0 不拋出 x % 0 可以拋出 // x / 0 可以用 intdiv(x, 0) 代替 會(huì)拋出 echo "Division By Zero Error: " . $divisionByZeroError . PHP_EOL; } catch (ArithmeticError $arithmeticError) { // 算數(shù)運(yùn)算錯(cuò)誤 intdiv(PHP_INT_MIN, -1) 觸發(fā) echo "Arithmetic Error: " . $arithmeticError . PHP_EOL; } catch (AssertionError $assertionError) { // 斷言錯(cuò)誤 echo "Assertion Error: " . $assertionError . PHP_EOL; } catch (Error $error) { // 基本錯(cuò)誤 echo "Error: " . $error . PHP_EOL; } echo "run finished!" . PHP_EOL;總結(jié)1、PHP 允許用戶自定義 Error 和 Exception 的捕獲與處理。如用戶未捕獲處理,則會(huì)遞交給 PHP 標(biāo)準(zhǔn)錯(cuò)/異常處理,根據(jù) errror_reporting display_errors log_erros error_log 參數(shù)決定處理方式。生產(chǎn)環(huán)境應(yīng)關(guān)閉 display_errors 同時(shí)開啟 log_errors 記錄錯(cuò)誤日志。
2、set_error_handler 可以捕獲 E_WARNING & E_NOTICE & E_DEPRECATED & E_USER_* 和 部分 E_STRICT 級(jí)的錯(cuò)誤。set_error_handler 如果返回了 false 錯(cuò)誤會(huì)遞交給 PHP 標(biāo)準(zhǔn)錯(cuò)誤處理。set_error_handler 不會(huì)終止程序執(zhí)行。
3、trigger_error 可以用來拋出用戶級(jí)的錯(cuò)誤,且 E_USER_ERROR 效用等同于 E_ERROR,PHP 標(biāo)準(zhǔn)錯(cuò)誤處理 捕獲此級(jí)別的錯(cuò)誤時(shí)會(huì)終止程序執(zhí)行。
4、set_exception_handler 用戶自定義異常捕獲,捕獲后程序依然會(huì)終止運(yùn)行,但不會(huì)再將異常遞交給 PHP 標(biāo)準(zhǔn)異常處理。
5、try ... catch 可以捕獲所有的 Exception 和 E_ERROR & E_PARSE 級(jí)的錯(cuò)誤。程序不會(huì)退出執(zhí)行。
6、PHP 自帶了一些 Predefined Exceptions,同時(shí)有規(guī)范一些 SPL Exceptions,供開發(fā)者規(guī)范自己的錯(cuò)誤異常架構(gòu)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/30816.html
摘要:但異常捕獲后程序可以繼續(xù)執(zhí)行,而真正的錯(cuò)誤出現(xiàn)后程序就必須終止異常可以使用來捕獲捕獲,捕獲之后后續(xù)代碼可以繼續(xù)執(zhí)行而錯(cuò)誤是無法使用捕獲的如果拋出了異常,就必須捕獲它否則程序終止執(zhí)行。 PHP錯(cuò)誤級(jí)別 Parse error > Fatal Error > Waning > Notice > Deprecated Deprecated 最低級(jí)別的錯(cuò)誤(不推薦,不建議)使用一些過期函數(shù)的...
摘要:下的異步嘗試系列下的異步嘗試一初識(shí)生成器下的異步嘗試二初識(shí)協(xié)程下的異步嘗試三協(xié)程的版自動(dòng)執(zhí)行器下的異步嘗試四版的下的異步嘗試五版的的繼續(xù)完善生成器類獲取迭代器當(dāng)前值獲取迭代器當(dāng)前值返回當(dāng)前產(chǎn)生的鍵生成器從上一次處繼續(xù)執(zhí)行重置迭代器向生成器中 PHP下的異步嘗試系列 PHP下的異步嘗試一:初識(shí)生成器 PHP下的異步嘗試二:初識(shí)協(xié)程 PHP下的異步嘗試三:協(xié)程的PHP版thunkify自...
摘要:重要使命經(jīng)過十幾天的忙碌,張小五手上的項(xiàng)目終于如期上線,雖然很累,但內(nèi)心無比的充實(shí)與喜悅。對(duì),是不好捕獲。從到對(duì)于碼農(nóng)來說,從到是解決問題的通途,當(dāng)然張小五也不例外。 重要使命 經(jīng)過十幾天的忙碌,張小五手上的項(xiàng)目終于如期上線,雖然很累,但內(nèi)心無比的充實(shí)與喜悅。喝了杯熱咖啡,小五在椅子上慵懶地躺著,享受著這份靜謐的時(shí)光。 嗨,小五,這幾天累壞了吧?哈哈,是有點(diǎn)累,不過還好。 周末好好休息...
摘要:請(qǐng)求未通過的驗(yàn)證時(shí)會(huì)拋出此異常。異常處理是非常重要但又容易讓開發(fā)者忽略的功能,這篇文章簡(jiǎn)單解釋了內(nèi)部異常處理的機(jī)制以及擴(kuò)展異常處理的方式方法。 異常處理是編程中十分重要但也最容易被人忽視的語(yǔ)言特性,它為開發(fā)者提供了處理程序運(yùn)行時(shí)錯(cuò)誤的機(jī)制,對(duì)于程序設(shè)計(jì)來說正確的異常處理能夠防止泄露程序自身細(xì)節(jié)給用戶,給開發(fā)者提供完整的錯(cuò)誤回溯堆棧,同時(shí)也能提高程序的健壯性。 這篇文章我們來簡(jiǎn)單梳理一下...
摘要:一的幾個(gè)函數(shù)異常捕獲自定義處理函數(shù)注冊(cè)錯(cuò)誤捕獲自定義處理函數(shù)注冊(cè)程序執(zhí)行時(shí)異常終止錯(cuò)誤捕獲處理函數(shù)注冊(cè)這三個(gè)函數(shù)在錯(cuò)誤處理控制中給開發(fā)者提供了很大的自主空間,在日志系統(tǒng)中記錄日志信息有他們的功勞。下面要說的類庫(kù)是借鑒了日志系統(tǒng)的設(shè)計(jì)。 引言 接觸過php框架的朋友們可能都知道,日志在項(xiàng)目中的重要作用了,他可以幫助我們定位錯(cuò)誤的位置,讓程序更友好(處理得當(dāng)?shù)脑挷粫?huì)直接拋出一大堆只有程...
閱讀 1618·2021-11-22 13:53
閱讀 2848·2021-11-15 18:10
閱讀 2755·2021-09-23 11:21
閱讀 2491·2019-08-30 15:55
閱讀 475·2019-08-30 13:02
閱讀 752·2019-08-29 17:22
閱讀 1659·2019-08-29 13:56
閱讀 3455·2019-08-29 11:31