PHP錯誤與異常處理

2021-08-08 16:52:03 字數 2088 閱讀 8171

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

錯誤等級

php 有幾個錯誤嚴重性等級。三個最常見的的資訊型別是錯誤(error)、通知(notice)和警告(warning)。它們有不同的嚴重性: e_error 、e_notice和 e_warning。錯誤是執行期間的嚴重問題,通常是因為**出錯而造成,必須要修正它,否則會使 php 停止執行。通知是建議性質的資訊,是因為程式**在執行期有可能造成問題,但程式不會停止。 警告是非致命錯誤,程式執行也不會因此而中止。

使用 php 內建的函式 error_reporting(),可以設定程式執行期間的錯誤等級,方法是傳入預定義的錯誤等級常量,這意味著如果你只想看到警告和錯誤 - 而非通知 - 你可以這樣設定:

error_reporting(e_error | e_warning); 

你可以讓 php 利用錯誤控制操作符 @ 來抑制特定的錯誤, 如@fopen()。將這個操作符放置在表示式之前,其後的任何錯誤都不會出現。但是我不建議這麼做。

錯誤報告

錯誤日誌對於發現程式中的錯誤是非常有幫助的,但是有些時候它也會將應用程式的結構暴露給外部。為了有效的保護你的應用程式不受到由此而引發的問題。

在開發環境中,我喜歡讓php顯示並記錄所有錯誤訊息,而在生產環境中,我會讓php記錄大多數錯誤訊息,但不顯示出來。不管怎麼做,一定要遵循以下4個規則:

我在php.ini中為開發環境設定錯誤報告方式如下:

;顯示錯誤 

display_errors = on 

display_startup_errors = on 

;報告所有錯誤 

error_reporting = -1

;記錄錯誤 

log_errors = on 

我在php.ini中為生產環境設定錯誤報告方式如下:

;不顯示錯誤 

display_errors = off 

display_startup_errors = off 

;除了注意事項之外,報告所有其他錯誤 

error_reporting = e_all & ~e_notice

;記錄錯誤 

log_errors = on 

異常捕獲

異常是許多流行程式語言的標配,但它們往往被 php 開發人員所忽視。像 ruby 就是乙個極度重視異常的語言,無論有什麼錯誤發生,像是 http 請求失敗,或者資料庫查詢有問題,甚至找不到乙個資源,ruby (或是所使用的 gems),將會丟擲異常,你可以通過螢幕立刻知道所發生的問題。

php 處理這個問題則比較隨意,呼叫 file_get_contents() 函式通常只會給出 false 值和警告。許多較早的 php 框架比如 codeigniter 只是返回 false,將資訊寫入專有的日誌,或者讓你使用類似 $this->upload->get_error() 的方法來檢視錯誤原因。這裡的問題在於你必須找出錯誤所在,並且通過翻閱文件來檢視這個類使用了什麼樣的錯誤的方法,而不是明確的暴露錯誤。

另乙個問題發生在當類自動丟擲錯誤到螢幕時會結束程式。這樣做會阻擋其他開發者動態處理錯誤的機會。應該丟擲異常讓開發人員意識到錯誤的存在,讓他們可以選擇處理的方式,例如:

<?php

$email = new fuel\email; 

$email->subject('my subject'); 

$email->body('how the heck are you?'); 

$email->to('[email protected]', 'some guy'); 

try 

catch(fuel\email\validationfailedexception $

e)  

catch(fuel\email\sendingfailedexception $

e)  

finally 

php 不丟擲異常 php錯誤與異常處理

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

PHP 錯誤與異常處理 一

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

PHP 錯誤,異常處理

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