搜尋
首頁後端開發PHP7PHP出現全域異常/錯誤怎麼辦

在開發中我們經常需要自訂錯誤和異常處理函數,來提供不同場景下更友善的處理提示。今天我們就來介紹一下用set_exception_handler/set_error_handler解決異常/錯誤的方法,有需要的可以參考參考。

PHP出現全域異常/錯誤怎麼辦

異常

如果我們拋出一個Exception 而沒有進行try catch 捕捉處理,系統將會產生致命錯誤,dump 出相關資訊後退出執行。

throw new Exception("Error Processing Request", 1);

Fatal error: Uncaught exception 'Exception' with message 'Error Processing Request'

set_exception_handler 則可以設定一個全域的例外處理函數,在例外沒有被try catch 處理時系統會將異常交於此函數處理

<?php
/**
 * 全局异常处理函数,会捕捉没有被 try catch 处理的异常
 * @param  [type] $exception [description]
 * @return [type]            [description]
 */
function func_exception_handler($exception)
{
    echo "User Exception:" .
        " [" . $exception->getCode() . "]" .
        " message " . $exception->getMessage() .
        " in file " . $exception->getFile() .
        " on line " . $exception->getLine() . PHP_EOL;
}

//如果不设定全局的异常处理函数 且 抛出异常时不使用 try catch 处理则会 fatal error
set_exception_handler("func_exception_handler");

try {
    throw new Exception("我会被 try catch 捕捉处理,不影响执行流程!");
} catch (Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}

throw new Exception("我没有被 try catch 捕捉处理,会被全局 set_exception_handler 处理!");

echo "没有被 try catch 处理的异常在我之前抛出,虽然被 set_exception_handler 但仍然会立刻退出执行,执行不到我哟" . PHP_EOL;

注意:不過因為仍沒有對異常進行try catch 處理,處理完後程式還是會退出執行,後續程式碼不會被執行。

錯誤

PHP 的錯誤我們常遇到的有: ERROR/WARNING/NOTICE

我們可以使用trigger_error 函數進行錯誤觸發,同時使用 set_error_handler 來定義我們自己的錯誤處理函數。

trigger_error 預設觸發的是使用者級的NOTICE 錯誤,不會影響執行流程,程式碼會繼續執行,我們可以在觸發時自己定義錯誤等級

注意:set_error_handler 是攔截使用者級的錯誤,它並不能讓腳本退出執行,除非你在自己的處理程式碼中手動實現錯誤層級的判斷。如果沒有進行攔截則使用者層級的錯誤也會交於系統的錯誤處理機制,系統的錯誤處理機制則是 error 退出,warning notice 提示後繼續執行。

trigger_error("notice, go on!", E_USER_NOTICE);

echo "executing!" . PHP_EOL;

trigger_error("warning, go on!", E_USER_WARNING);

echo "executing!" . PHP_EOL;

trigger_error("error, exit!", E_USER_ERROR);

echo "not execute!";

自訂錯誤處理後錯誤將不會再傳遞給系統處理

<?php
/**
 * 用户自定义的错误处理
 * @param  [type] $err_no   错误级别
 * @param  [type] $err_msg  错误信息
 * @param  [type] $err_file 错误文件
 * @param  [type] $err_line 错误所在行
 * @return [type]           [description]
 */
function func_error_handler($err_no, $err_msg, $err_file, $err_line)
{
    //trigger_error 默认触发的为 notice 级别的用户错误
    $level = [
        E_USER_ERROR => "Error",
        E_USER_WARNING => "Waring",
        E_USER_NOTICE => "Notice"
    ];

    echo "User {$level[$err_no]}: " .
        " [" . $err_no . "]" .
        " message " . $err_msg .
        " in file " . $err_file .
        " on line " . $err_line . PHP_EOL;

    //如果需要 我们可以手动判断错误级别是否退出执行
    if ($err_no == E_USER_ERROR) {
        exit("fatal error, exit!");
    }
}

set_error_handler("func_error_handler");

trigger_error("notice, go on!", E_USER_NOTICE);

trigger_error("warning, go on!", E_USER_WARNING);

trigger_error("error, exit!", E_USER_ERROR);

#提示:

異常拋出但不使用try catch 處理,系統會產生一個致命錯誤導致腳本退出執行,set_exception_handler 只是將沒有被try catch 處理的異常進行捕捉,自定義一些友好的信息輸出,並不能阻止致命錯誤的產生,腳本依然會退出執行。

set_error_handler 則會將使用者觸發的錯誤攔截下來進行處理,而不再提交給系統,但它不會自動識別錯誤級別,我們需要手動判斷是否為ERROR 級的進行退出,還是WARNING 或NOTICE 等級的進行提示後繼續執行。

推薦學習:php影片教學

以上是PHP出現全域異常/錯誤怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具