溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中錯(cuò)誤處理的原理是什么

發(fā)布時(shí)間:2021-06-22 16:52:27 來(lái)源:億速云 閱讀:127 作者:Leah 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)PHP中錯(cuò)誤處理的原理是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

錯(cuò)誤處理

PHP語(yǔ)言開(kāi)發(fā)簡(jiǎn)單之處也體現(xiàn)在可以提供豐富的錯(cuò)誤信息。

錯(cuò)誤顯示

修改 php.ini 配置文件, display_errors = On 即開(kāi)啟錯(cuò)誤顯示。

錯(cuò)誤類型

語(yǔ)法錯(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

運(yùn)行錯(cuò)誤

經(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ò)誤

邏輯錯(cuò)誤是指軟件開(kāi)發(fā)工程師在業(yè)務(wù)邏輯開(kāi)發(fā)中造成錯(cuò)誤。

下面展示一個(gè)工程師分析不到位,造成的邏輯錯(cuò)誤示例。

for ($i = 0; $i < 5; $i--) {
    echo $i;
}

錯(cuò)誤報(bào)告

常見(jiàn)錯(cuò)誤類型

值常量描述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ò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

php
AI