中文字幕视频在线看,亚洲精品无码久久久久av老牛,亚洲精品无码av片,亚洲av影院一区二区三区,亚洲国产精品成人久久久

Php文件常見錯誤有哪些?如何進行排查和修復?

初學者在編程時,經(jīng)常會遇到各種錯誤,這時就需要根據(jù)不同的錯誤類型進行處理,正確的錯誤處理方法可以提高開發(fā)效率。

Php文件常見錯誤有哪些?如何進行排查和修復?

一:錯誤(Error)

1.1 什么是錯誤及錯誤的級別

錯誤是指在開發(fā)階段中由一些失誤引起的程序問題,根據(jù)其出現(xiàn)在編程過程中的不同環(huán)節(jié)。這些錯誤一般是由PHP內部引擎和擴展程序引發(fā),或通過?trigger_error()?函數(shù)拋出

PHP中每個錯誤都有一個錯誤級別與之對應,如表所示

級別

說明

E_ALL

所有錯誤和警告信息

E_ERROR

致命的運行時錯誤(它會阻止腳本運行)

E_WARNING

運行時警告(非致命的錯誤)

E_PARSE

編譯時語法解析錯誤

E_NOTICE

運行時通知,表示腳本遇到可能會表現(xiàn)為錯誤的情況

E_STRICT

啟用 PHP 對代碼的修改建議

E_CORE_ERROR

PHP初始啟動期間發(fā)生的致命錯誤

E_CORE_WARNING

PHP初始啟動期間出現(xiàn)的警告(非致命的錯誤)

E_COMPILE_ERROR

編譯時致命錯誤

E_COMPILE_WARNING

編譯時警告(非致命錯誤)

E_USER_ERROR

用戶產生的錯誤信息

E_USER_WARNING

用戶產生的警告信息

E_USER_NOTICE

用戶產生的通知信息

每個錯誤級別常量都是一個整數(shù),此處并沒有列出其值,使用時可以通過按位運算符來組合這些常量,用來表示某些類型的錯誤

1.2 顯示錯誤級別

在開發(fā)程序時,有時希望可以控制是否顯示錯誤以及顯示錯誤的級別。為此,PHP提供了兩種方法來顯示錯誤報告,如下所示:

1.2.1 修改配置文件

在配置文件?php.ini?中修改配置指令error_reporting的值,修改完成后重新啟動Web服務器,具體示例如下:

error_reporting(E_All & ~E_NOTICE);
display_errors=on;

注意:如果不知道?php.ini?文件的具體位置,可以使用?php –ini?查看配置文件的具體位置

error_reporting:顯示錯誤的級別,多個錯誤級別用?&?分割,如果不想顯示某個錯誤級別只需要在錯誤級別前加上?~?符號即可,這個符號等同于邏輯符號?取反?的意思

display_errors:是否開啟顯示錯誤,默認為開啟(on),關閉設置為?off?即可

重啟web服務時,如果是nginx服務器類型的服務器,需要重啟php-fpm

1.2.2 ini_set()和error_reporting()函數(shù)

除了通過配置文件修改顯示錯誤級別,還可以通過?ini_set()??error_reporting()?函數(shù)來實現(xiàn)。

error_reporting()函數(shù)等同于配置文件中的?error_reporting?配置選項。

ini_set()函數(shù)可以設置配置文件中所有可配置的選項,自然也包括error_reporting選項。其格式如下:

ini_set(string $varname, string $newvalue)

$varname:配置文件中的配置選項

$newvalue:新的值

1.3 錯誤日志記錄

不管是何種類型的錯誤,默認情況下,PHP都會給出提示信息。在實際Web開發(fā)中,顯示錯誤會造成極差的用戶體驗,還會給服務器帶來安全隱患。例如錯誤信息一般包含文件路徑信息,黑客據(jù)此可以發(fā)起攻擊。故此,實際工作中,我們不會顯示系統(tǒng)錯誤,一般都是把錯誤信息記錄到日志文件。

錯誤日記的記錄可以通過 php.ini 文件配置,主要就是開啟日志記錄和記錄日志的文件路徑:

# 開啟錯誤日志
log_errors = On

# 錯誤日志記錄的文件路徑
error_log = '/tmp/runtime/php/error.php'

正式環(huán)境,建議大家關閉顯示錯誤信息,把所有錯誤記錄到日志文件中。這樣可以有效避免黑客攻擊我們的服務器。

1.4 自定義錯誤處理函數(shù)

通過?set_error_handler()?函數(shù)設置全局錯誤處理函數(shù)。如果我們設置了處理函數(shù),PHP出現(xiàn)錯誤時,就會把所有錯誤回調到我們設定的函數(shù)中,具體用法如下:

set_error_handler(callable $error_handler, int $error_types = E_ALL | E_STRICT)

error_handler:錯誤處理句柄,即錯誤處理的回調函數(shù)

error_types:錯誤類型,可以是多個

用戶自定義的函數(shù)(error_handler)的參數(shù):

  1. $error_type:錯誤類型
  2. $errstr:錯誤信息
  3. $errfile:產生錯誤的文件地址
  4. $errline:產生錯誤的行號
  5. $errcontext:包含參數(shù)和變量信息

整體用法如下:

function error_function($error_level, $error_message, $error_file, $error_line, $error_context){
    // 錯誤處理邏輯
}
// 設置錯誤處理句柄
set_error_handler('error_function', E_WARNING); // 這里error_function對應上面創(chuàng)建的自定義處理器名,第二個參數(shù)為使用自定義錯誤處理器的錯誤級別;

現(xiàn)在我們就可以在錯誤處理句柄中處理具體的錯誤邏輯,報錯日志記錄等。

二:異常(Exception)

上面我們介紹了錯誤及錯誤級別,但是錯誤往往只是粗淺的記錄的錯誤信息及產生錯誤的文件。但是錯誤是不可預見的,無法提前處理。但是有些錯誤我們是可以提前預料到的,比如某個參數(shù)漏了,或者參數(shù)的值不對時,我們就應該這類錯誤做出警告并記錄錯誤信息。如何優(yōu)雅的實現(xiàn)這樣的需求呢?此時異常處理就能很好的實現(xiàn)該功能了。

異常處理是對可預見且可處理的錯誤情況進行處理,一般都是由開發(fā)者自己手動創(chuàng)建并拋出。

Error和Exception都實現(xiàn)了Throwable接口,大部分Error和所有Exception都可以使用catch (Throwable $e)捕獲它們

2.1 異常處理機制

throw語句拋出異常后,如果異常沒有被try/catch捕獲并處理,程序會終止并報出致命錯誤,如果是被?set_exception_handler()?捕獲后,程序會終止。相反,如果被try/catch捕獲后,程序可以繼續(xù)執(zhí)行。

2.2 捕獲異常

set_exception_handler(callable $exception_handler)函數(shù)設置默認的異常處理函數(shù)??梢圆东@大部分錯誤和異常,但不能捕獲警告和通知類型的錯誤。使用方法和上面的?set_error_handler()?相同,大家可以參考上面的寫法

2.3 try/catch 捕獲異常

大部分的Error 和所有 Exception異常都能被捕獲,而warning和notice類的錯誤(Error)不能被捕獲并且通過?trigger_errors()?拋出的用戶級別的錯誤不能被捕獲。格式如下:

<?php
try {
    // PHP 腳本執(zhí)行發(fā)生錯誤或手動拋出錯誤
    throw new Exception('錯誤信息');
} catch (Exception $e) {
    // 根據(jù)類型捕獲錯誤
    var_dump('異常');
} finally {
    // 異常處理完之后依然會執(zhí)行finally,如果不想異常處理完后執(zhí)行finally,可以在catch中使用exit()終止程序
    // return 語句之后仍會執(zhí)行 finally,但 die 和 exit 后不會執(zhí)行 finally
    var_dump('不管有沒有異常都會執(zhí)行的代碼塊');
}

注意:exit()及die()是終止程序,無法捕獲。因此,exit()和die()之后不會執(zhí)行finally?。但是如果我們在try/catchreturn,最后依然會執(zhí)行finally

在現(xiàn)代PHP的web框架中,框架都已經(jīng)幫我們實現(xiàn)的異常捕獲相關封裝,如果我們想要自己接管異常處理,可以通過配置異常句柄顯示。例如,ThinkPHP中就可以通過配置?thinkexceptionHandle?來接管異常處理句柄。

版權聲明:本文內容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內容, 請發(fā)送郵件至2705686032@qq.com 舉報,一經(jīng)查實,本站將立刻刪除。原文轉載: 原文出處:

(0)
云計算的頭像云計算
上一篇 2024 年 8 月 17 日 09:14
下一篇 2024 年 8 月 17 日 09:21

相關推薦

發(fā)表回復

登錄后才能評論

聯(lián)系我們

400-900-3935

在線咨詢: QQ交談

郵件:cong@zun.com

工作時間:365天無休服務 24小時在線

添加微信