我遵循良好的編程習慣,並將PHP錯誤記錄到文件而不是將其顯示給用戶。我使用set_error_handler()
。@錯誤抑制運算符和set_error_handler
現在的問題。例如,我有一個地方:
@file_exists('/some/file/that/is/outside/openbasedir.txt');
但儘管錯誤抑制運算符,錯誤消息日誌。我不想那樣。我想抑制錯誤不傳遞給我的錯誤處理程序。
我遵循良好的編程習慣,並將PHP錯誤記錄到文件而不是將其顯示給用戶。我使用set_error_handler()
。@錯誤抑制運算符和set_error_handler
現在的問題。例如,我有一個地方:
@file_exists('/some/file/that/is/outside/openbasedir.txt');
但儘管錯誤抑制運算符,錯誤消息日誌。我不想那樣。我想抑制錯誤不傳遞給我的錯誤處理程序。
的@
運營商臨時將使用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_errors
和error_log
選項,用於自動將錯誤記錄到文件或系統日誌。
實際上您應該避免使用@
運算符。首先,它速度很慢,我甚至稱它是有害的。
你應該有,而不是在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);
我創建了..爲什麼我在這裏得到一個downvote ..是拼寫? –
我沒有downvote,但只是說避免@使用不會回答這個問題。有時PHP會拋出可以被捕獲的異常,有時會顯示愚蠢的通知,這些通知不能被捕獲。在這種情況下,關閉整個應用程序的錯誤不是一個合理的解決方案。在現場沉默它們並不理想,但稍好一點(特別是對於像file_exists或file_get_contents這樣的情況,如果出現錯誤,它已經返回false,所以你不需要通知)。理想情況下,PHP不會因爲報告錯誤而被打破,但是因爲我們需要使用它。 –
避免使用「@」。這是一個好兆頭,你做錯了什麼,不想修復它。但是,即使語句本身通過「@」進行了「沉默」,errorhandler回調也會被調用。 – KingCrunch
我認爲使用'@ $ a'是可以接受的,而不是'isset($ a)?$ a:'''。代碼的可讀性超過了「缺點」。 –
@Rok:你會注意到它也有一些性能影響; '@'隱藏錯誤,但它們仍然生成,格式化,調用錯誤處理程序等。只需構建代碼,以便不必使用isset()。 – arnaud576875