和其他程式語言遇到錯誤就丟擲異常不一樣,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...