php 的錯誤與異常處理(一)錯誤處理

2021-08-10 09:07:10 字數 2843 閱讀 1038

前言:

好的**,不僅僅要**設計優美,結構清晰。更要有完善的錯誤處理機制,特別是針對異常的處理,只有這樣才能在系統出現問題的時候,準確排查錯誤。記住,錯誤和異常不是一回事,錯誤是開發階段的一些失誤,引起的程式問題,您只要解決掉錯誤才能推進程式的開發。異常,則是專案在執行的過程中遇到的一些意外,導致程式執行失敗。

錯誤處理:

錯誤主要分語法錯誤,執行時錯誤,邏輯錯誤三大種。

語法錯誤: 語法錯誤最常見,比如遺漏了「}「號,遇到這樣的錯誤,後面的程式就不能繼續執行了。

執行時錯誤:這種錯誤發生在編譯時,例如在header()函式前有字元輸出,php通常會顯示一條錯誤,但是後面的程式能繼續執行。

邏輯錯誤:屬於您自身程式邏輯的設計錯誤,不影響程式執行,但是和您期望的結果會有偏差,比如在jf判斷的時候,==判斷錯寫成=。變成了賦值語句,永遠返回true。

錯誤級別:執行php是,php解析器會盡可能的匯報它遇到的錯誤,這是php解析器的相關功能。如果您不希望php解析器顯示錯誤,可以修改php.ini檔案中的display_errors=off。注意,這只是關閉的錯誤的顯示,錯誤依然存在。主要用於線上環境,您不希望客戶看到錯誤等敏感資訊時使用。

php解析器會按照錯誤發生的嚴重程度進行匯報,有些錯誤比較嚴重,程式會暫停。有些錯誤則只是警告,會繼續執行。您可以通過修改php.ini的error_reporting=e_aal&~e_notice設定您想看到的錯誤級別。比如您想看到所以錯誤,除了警告錯誤。

1     e_error           致命的執行錯誤。錯誤無法恢復,暫停執行指令碼。

2 e_warning 執行時警告(非致命性錯誤)。非致命的執行錯誤,指令碼執行不會停止。

4 e_parse 編譯時解析錯誤。解析錯誤只由分析器產生。

8 e_notice 執行時提醒(這些經常是你**中的bug引起的,也可能是有意的行為造成的。)

16 e_core_error php 啟動時初始化過程中的致命錯誤。

32 e_core_warning php啟動時初始化過程中的警告(非致命性錯)。

64 e_compile_error 編譯時致命性錯。這就像由zend指令碼引擎生成了乙個e_error。

128 e_compile_warning 編譯時警告(非致性錯)。這就像由zend指令碼引擎生成了e_warning警告。

256 e_user_error 自定義錯誤訊息。像用php函式trigger_error(程式設計師設定e_error)

512 e_user_warning 自定義警告訊息。像用php函式trigger_error(程式設計師設的e_warning警告)

1024 e_user_notice 自定義的提醒訊息。像由使用php函式trigger_error(程式設計師e_notice集)

2048 e_strict 編碼標準化警告。允許php建議修改**以確保最佳的互操作性向前相容性。

4096 e_recoverable_error 開捕致命錯誤。像e_error,但可以通過使用者定義的處理捕獲(又見set_error_handler())

8191 e_all 所有的錯誤和警告(不包括 e_strict) (e_strict will be part of e_all as of php 6.0)

16384 e_user_deprecated

30719 e_all

修改錯誤級別還是比較常用的,每次修改php.ini太麻煩了,所以php提供了error_reporting(0);函式來處理。

例子:

<?php 

//開啟php.ini中的錯誤顯示

ini_set('display_errors',1);

//錯誤輸出級別-所有錯誤

error_reporting(e_all);

//注意:notice的報告,不會阻止指令碼的執行,並且可能不是乙個問題。

gettype($var);

//警告:warning的報告,不會阻止指令碼的執行,但應該是乙個問題。

gettype();

//錯誤:error的報告,會阻止指令碼的執行

get_type();

?>

您得到的錯誤如下,可以清楚的看到php是怎樣按照錯誤的級別提交錯誤的。您可以試試,降error錯誤放到前面,您會發現後面的錯誤不會觸發了,因為程式終止了!

到目前為止,您看到的錯誤,都是由於錯誤的**,php解析器發現後給您丟擲的。那自己要能否丟擲這些錯誤呢?答案是肯定的

<?php 

$site = "";

fopen($site,"r")

or die("unable to connect to $site");

?>

在上面的**中,我們通過die來結束**,並返回字串提示錯誤。但是提示的錯誤資訊只是乙個字串,過於簡單。

您可以通過trigger_error(error_msg)函式來丟擲錯誤。

<?php 

$site = "";

fopen($site,"r")

or trigger_error("unable to connect to $site");

?>

PHP 錯誤與異常處理 一

異常與錯誤 以上是php中錯誤和異常的乙個概念,php中任何自身的錯誤或者是非正常的 都會當做錯誤對待,並不會以異常的形式丟擲,但是也有一些情況會當做異常和錯誤同時丟擲。也就是說,你想在資料庫連線失敗的時候自動捕獲異常是行不通的,因為這就不是異常,是錯誤。要做錯誤處理,必須得明細錯誤級別 fatal...

PHP錯誤與異常處理

和其他程式語言遇到錯誤就丟擲異常不一樣,php在處理物件時它也有異常機制,但是php會盡可能的愉快的去執行而無視發生的事情,除非遇到乙個極端嚴重錯誤才會丟擲異常。本文概述php相關的錯誤異常處理機制。錯誤等級 php 有幾個錯誤嚴重性等級。三個最常見的的資訊型別是錯誤 error 通知 notice...

PHP 錯誤,異常處理

ini set display errors false 影響的是否在php頁輸出錯誤資訊,但不影響在錯誤日誌檔案輸出 error reporting 0 錯誤級別,影響在php頁輸出及日誌檔案輸出 error log aaa 函式向錯誤日誌寫一條資訊,但是不受set error handler s...