91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

PHP錯誤與異常的處理

發布時間:2021-10-11 11:47:05 來源:億速云 閱讀:210 作者:柒染 欄目:大數據

PHP錯誤與異常的處理,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

錯誤與異常

錯誤,可以理解程序本身的錯誤,例如語法錯誤。而異常則更偏向于程序運行不符合預期或者不符合正常流程;對于 PHP 語言而言,處理錯誤和處理異常使用的機制完全不同,因此很容易讓人產生困惑。

例如,我們希望通過捕獲異常來處理除數為 0 的情況,但是在捕獲到異常之前,PHP 就觸發了錯誤。

try {
    $a = 5 / 0;
} catch (Exception $e) {
    $e->getMessage();
    $a = -1;  // 通過異常來處理 $a 為 0 的情況,但是實際上,捕獲不到該異常
}

echo $a;
// PHP Warning:  Division by zero

也就是說,PHP 將除數為 0 的情況當成了錯誤而觸發,而不會自動拋出異常,因此沒法捕獲。類似的,在很多情況下,PHP 都沒辦法自動拋出異常。只能通過 if - else 語句判斷再結合 throw 方法來并手動拋出異常。

上述情況的發生,主要還是因為異常機制是 PHP 向面向對象演進后得到的產物。而在此之前 PHP 的報錯主要還是通過錯誤機制,因此,在很多情況下,PHP 的錯誤要比異常更有價值。不過 PHP7 開始統一這兩者,使錯誤也可以像異常那樣拋出(這部分內容將放在異常部分講解)。

錯誤級別

PHP 中的錯誤可理解為 使腳本不運行不正常的情況,根據錯誤級別從高到低可劃分為五類

  1. Parse error 或 Syntax Error - 語法解析錯誤,觸發該錯誤后,腳本完全無法運行;

  2. Fatal Error - 致命錯誤,觸發該錯誤后,后面的腳本無法繼續執行;

  3. Warning Error - 出現比較不恰當的地方,腳本可繼續執行

  4. Notice Error - 出現不恰當的地方,但是程度比 Warning Error 低,腳本可繼續執行

  5. Deprecated Error - 不推薦這么使用,未來可能會廢棄,腳本可繼續執行

默認情況下,PHP 觸發錯誤,并顯示錯誤的級別及對應的提示。

Parse Error 示例 - 語句結尾不寫分號

echo "abc"
// PHP Parse error:  syntax error, unexpected end of file, expecting ',' or ';

Fatal Error 示例 - 使用不存在的函數

echo "before\n";
foo();
echo "after"; // 本行無法繼續執行
// before
// PHP Fatal error:  Uncaught Error: Call to undefined function foo()

Warning Error 示例 - 引入不存在的文件

$a = "foo";
include('bar.php');
echo $a; // 程序繼續執行
// PHP Warning:  include(bar.php): failed to open stream: No such file or directory ...
// foo

Notice Error 示例 - 輸出不存在的變量

echo $foo;
echo 12345;
// PHP Notice:  Undefined variable: foo
// 12345

Deprecated Error 示例 - 在一些字符串函數中傳入數字而非字符串

strpos('12345', 3);
// PHP Deprecated:  strpos(): Non-string needles will be interpreted as strings in the future

除了默認觸發消息外,用戶也可以使用 set_error_handler 函數自定義錯誤處理,大多數錯誤類型都可以進行自定義處理,除了 E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 外。

set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

示例

<?php
// E_ALL - 處理全部錯誤類型
set_error_handler('customError', E_ALL);

/**
 * @param  int $errno 錯誤的級別
 * @param  string $errstr  錯誤的信息
 * @param  string $errfile 錯誤的文件名(可選)
 * @param  string $errline 錯誤發生的行號(可選)
 */
function customError(int $errno, string $errstr, string $errfile, string $errline)
{
    echo sprintf('錯誤消息為 %s', $errstr);
}

$a = 5 / 0;  // 錯誤消息為 Division by zero

用戶也可以通過 trigger_error 函數來手動觸發一個用戶級別的錯誤(E_USER_ERRORE_USER_WARNINGE_USER_NOTICEE_USER_DEPRECATED)。

function division($a, $b) {
    if($b == 0){
        @trigger_error("0 不能作為除數", E_USER_NOTICE);
        return -1;
    }
    return $a / $b;
}

echo division(10, 0);

與錯誤有關的配置

一些錯誤處理相關的常用配置

  • error_reporting - 設置錯誤的報告級別

  • display_errors - 是否顯示錯誤

  • display_startup_error - 是否顯示 PHP 啟動過程中的顯示

  • log_errors - 設置是否將腳本運行的錯誤信息記錄到服務器錯誤日志或者 error_log 之中

《Modern PHP》提出了四個規則

  1. 一定要讓 PHP 報告錯誤;

  2. 在開發環境中要顯示錯誤;

  3. 在生產環境中不能顯示錯誤;

  4. 在開發環境和生產環境中都要記錄錯誤;

開發環境推薦配置

display_errors = On
display_startup_error = On
error_reporting = -1
log_errors = On

生產環境推薦配置

display_errors = Off
display_startup_error = Off
; 報告 Notice 以外的所有錯誤
error_reporting = E_ALL & ~E_NOTICE
log_errors = On

Symfony 編碼規范相關

異常和錯誤消息字符串必須使用 sprintf 來進行拼接;

throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));

當錯誤類型為 E_USER_DEPRECATED 時,需要添加 @

@trigger_error("foo", E_USER_DEPRECATED);

關于PHP錯誤與異常的處理問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

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

php
AI

图片| 夏津县| 奉新县| 南漳县| 青海省| 平罗县| 沁源县| 千阳县| 浪卡子县| 马关县| 茂名市| 肥西县| 定兴县| 长顺县| 永康市| 富宁县| 宽甸| 通许县| 临泽县| 手游| 武义县| 吉隆县| 竹北市| 无为县| 莒南县| 大悟县| 东源县| 临清市| 闽清县| 大宁县| 泽州县| 南江县| 雅江县| 博爱县| 林西县| 永仁县| 青州市| 交口县| 剑河县| 太原市| 东乡|