set_error_handle 和 at(@)符號的有關問題
來源:互聯網
上載者:User
set_error_handle 和 at(@)符號的問題
問題是這樣的,我用set_error_handle 將一些系統錯誤或者警告資訊寫入到記錄檔中。
但是對於一些api 比如fopen之類的,如果檔案不存在的情況下也會跑到 自己寫的錯誤處理函數中,[email protected],對諸如此類問題不進行顯示。
[email protected]功能去掉。怎麼做啊?
謝謝大俠們了
------解決方案--------------------
用try catch捕獲
------解決方案--------------------
可以去掉,使用set_error_handler你只需要注意兩點:
1.set_error_handler只會捕獲error_reporting裡定義的錯誤類型,這個可以在php.ini裡配置,也可以使用函數設定;
2.自訂的錯誤處理函數傳回值如果為false,則會觸發php的預設錯誤處理。而傳回值為true則不會觸發php預設的錯誤處理,則看不到那個討厭的報錯了。
至於寫法你可以參考一下。
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
//如果這個錯誤類型沒有包含在error_reporting裡
return;
}
switch ($errno) {
case E_USER_ERROR:
echo "
My ERROR [$errno] $errstr
\n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")
\n";
echo "Aborting...
\n";
exit(1);
break;
case E_USER_WARNING:
echo "
My WARNING [$errno] $errstr
\n";
break;
case E_USER_NOTICE:
echo "
My NOTICE [$errno] $errstr
\n";
break;
default:
echo "Unknown error type: [$errno] $errstr
\n";
break;
}
//返回false則會觸發php的預設錯誤處理,反回true則只用自訂函數處理。
return true;
}
set_error_handler('myErrorHandler');
fopen('/tmp/foo', 'r');
------解決方案--------------------
經測試,#5的代碼可以滿足你的要求!
執行後,若
fopen('/tmp/foo', 'r');
失敗,則顯示
Unknown error type: [2] fopen(/tmp/foo) [function.fopen]: failed to open stream: No such file or directory
若
@fopen('/tmp/foo', 'r');
失敗,則無任何顯示