您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)PHP中錯(cuò)誤處理的原理是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
PHP語(yǔ)言開(kāi)發(fā)簡(jiǎn)單之處也體現(xiàn)在可以提供豐富的錯(cuò)誤信息。
修改 php.ini
配置文件, display_errors = On
即開(kāi)啟錯(cuò)誤顯示。
違背了程序語(yǔ)言的規(guī)則錯(cuò)誤,稱之為語(yǔ)法錯(cuò)誤。比如不以分號(hào)結(jié)束的語(yǔ)句,或函數(shù)寫(xiě)錯(cuò)時(shí)都會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤。語(yǔ)法錯(cuò)誤PHP會(huì)在運(yùn)行前檢測(cè)出來(lái)。
下面代碼沒(méi)有以分號(hào)結(jié)束,將報(bào)語(yǔ)法錯(cuò)誤
<?php echo 'houdunren'
錯(cuò)誤內(nèi)容如下
( ! ) Parse error: syntax error, unexpected end of file, expecting ',' or ';' in C:\wamp64\www\php\index.php on line 3
經(jīng)過(guò)語(yǔ)法錯(cuò)誤檢測(cè)后,將開(kāi)始運(yùn)行PHP代碼,在此發(fā)生的錯(cuò)誤為運(yùn)行時(shí)錯(cuò)誤。
以下代碼因?yàn)榧虞d不存在文件,所以會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤。
<?php require 'houdunren';
錯(cuò)誤內(nèi)容如下
( ! ) Warning: require(houdunren): failed to open stream: No such file or directory in C:\wamp64\www\php\index.php on line 2
常見(jiàn)運(yùn)行錯(cuò)誤如下:
加載不存在文件
連接數(shù)據(jù)庫(kù)失敗
遠(yuǎn)程請(qǐng)求失敗
函數(shù)或類不存在
如果有用戶數(shù)據(jù)參與的腳本,需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)。
邏輯錯(cuò)誤是指軟件開(kāi)發(fā)工程師在業(yè)務(wù)邏輯開(kāi)發(fā)中造成錯(cuò)誤。
下面展示一個(gè)工程師分析不到位,造成的邏輯錯(cuò)誤示例。
for ($i = 0; $i < 5; $i--) { echo $i; }
值常量描述1E_ERROR致命的運(yùn)行時(shí)錯(cuò)誤。這類錯(cuò)誤一般是不可恢復(fù)的情況,例如內(nèi)存分配導(dǎo)致的問(wèn)題。后果是導(dǎo)致腳本終止不再繼續(xù)運(yùn)行2E_WARNING運(yùn)行時(shí)警告 (非致命錯(cuò)誤)。僅給出提示信息,但是腳本不會(huì)終止運(yùn)行。8E_NOTICE運(yùn)行時(shí)通知。表示腳本遇到可能會(huì)表現(xiàn)為錯(cuò)誤的情況。64E_COMPILE_ERROR致命編譯時(shí)錯(cuò)誤。類似 E_ERROR2048E_STRICT啟用 PHP 對(duì)代碼的修改建議,以確保代碼具有最佳的互操作性和向前兼容性。8192E_DEPRECATED運(yùn)行時(shí)通知。啟用后將會(huì)對(duì)在未來(lái)版本中可能無(wú)法正常工作的代碼給出警告。8191E_ALL所有錯(cuò)誤和警告,除級(jí)別 E_STRICT 以外。
關(guān)閉警告與致命錯(cuò)誤
error_reporting(~E_WARNING & ~E_COMPILE_ERROR); require('a');
顯示除通知外的所有錯(cuò)誤
error_reporting(E_ALL & ~E_NOTICE); echo $houdunren;
關(guān)閉錯(cuò)誤顯示
error_reporting(0);
通過(guò)自定義錯(cuò)誤與日志處理引擎,讓錯(cuò)誤處理個(gè)性化。同時(shí)有些錯(cuò)誤是在用戶訪問(wèn)發(fā)生的,通過(guò)日志可以更全面檢測(cè)網(wǎng)站運(yùn)行狀態(tài)。
<?php namespace Core; class Error { # debug 開(kāi)啟狀態(tài) protected $debug; public function __construct($debug = true) { $this->debug = $debug; } public function bootstrap() { error_reporting(0); # 自定義錯(cuò)誤處理 set_error_handler([$this, 'error'], E_ALL | E_STRICT); } public function error($errno, $error, $file, $line) { $msg = $error . "($errno)" . $file . " ($line)."; switch ($errno) { case E_USER_ERROR: case E_USER_NOTICE: break; case E_NOTICE: # 開(kāi)啟debug時(shí)顯示提示消息 if ($this->debug) echo $msg; break; default: if ($this->debug) { include 'debug.php'; } else { $file = 'logs/' . date('Y_m_d') . '.log'; # 記錄錯(cuò)誤日志到文件 error_log(date("[ c ]") . $msg . PHP_EOL, 3, $file, null); } die; } } } (new Error(false))->bootstrap(); include('houdunren.com');
錯(cuò)誤顯示頁(yè)面
debug.php用于顯示開(kāi)啟debug時(shí)的錯(cuò)誤顯示頁(yè)面。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container mt-3"> <div class="card"> <div class="card-header"> <?php echo 'File:' . $file . ' Line:' . $line; ?> </div> <div class="card-body p-0"> <ul class="list-group list-group-flush"> <?php foreach (debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) as $id => $f) : ?> <li class="list-group-item"> <?php echo "#$id " . $f['file'] . "({$f['line']})<br/>"; ?> </li> <?php endforeach; ?> </ul> </div> </div> </div> </body> </html>
關(guān)于PHP中錯(cuò)誤處理的原理是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。