2011-09-11 21 views
13

我遵循良好的編程習慣,並將PHP錯誤記錄到文件而不是將其顯示給用戶。我使用set_error_handler()@錯誤抑制運算符和set_error_handler

現在的問題。例如,我有一個地方:

@file_exists('/some/file/that/is/outside/openbasedir.txt'); 

但儘管錯誤抑制運算符,錯誤消息日誌。我不想那樣。我想抑制錯誤不傳遞給我的錯誤處理程序。

+2

避免使用「@」。這是一個好兆頭,你做錯了什麼,不想修復它。但是,即使語句本身通過「@」進行了「沉默」,errorhandler回調也會被調用。 – KingCrunch

+0

我認爲使用'@ $ a'是可以接受的,而不是'isset($ a)?$ a:'''。代碼的可讀性超過了「缺點」。 –

+0

@Rok:你會注意到它也有一些性能影響; '@'隱藏錯誤,但它們仍然生成,格式化,調用錯誤處理程序等。只需構建代碼,以便不必使用isset()。 – arnaud576875

回答

23

@運營商臨時將使用error_reporting爲0,這樣你就可以測試你的錯誤處理程序使用error_reporting值:

if (ini_get('error_reporting') == 0) { 
    return; 
} 

甚至更​​好,只記錄了在使用error_reporting錯誤類型:

$error_reporting = ini_get('error_reporting'); 

if (!($error_reporting & $errno)) { 
    return; 
} 

另請參閱log_errorserror_log選項,用於自動將錯誤記錄到文件或系統日誌。

+0

那麼,基本上你是說** @臨時**將error_reporting設置爲零? –

+0

是的,這是它的作用 – arnaud576875

+1

謝謝,這正是我**問**的原因。這是完美的。 –

2

實際上您應該避免使用@運算符。首先,它速度很慢,我甚至稱它是有害的。

你應該有,而不是在php.ini文件有兩個行:

error_repoting = E_ALL | E_STRICT 
display_errors = Off 

...或者,如果你沒有訪問php.ini文件,然後在index.php文件頂部(或任何其他引導文件),您應該添加:

error_reporting(E_ALL | E_STRICT); 
ini_set('display_errors', 0); 
+1

我創建了..爲什麼我在這裏得到一個downvote ..是拼寫? –

+1

我沒有downvote,但只是說避免@使用不會回答這個問題。有時PHP會拋出可以被捕獲的異常,有時會顯示愚蠢的通知,這些通知不能被捕獲。在這種情況下,關閉整個應用程序的錯誤不是一個合理的解決方案。在現場沉默它們並不理想,但稍好一點(特別是對於像file_exists或file_get_contents這樣的情況,如果出現錯誤,它已經返回false,所以你不需要通知)。理想情況下,PHP不會因爲報告錯誤而被打破,但是因爲我們需要使用它。 –