2009-08-16 60 views
3

請告訴我,如果這是正確的。在我的錯誤處理程序中,我需要能夠檢測何時使用@ error-control操作符來抑制錯誤,因爲一些外部庫(可悲地)會使用它。應該繼續執行腳本,就像不使用自定義錯誤處理程序一樣。檢測錯誤控制運算符

當使用符號時,PHP臨時將error_reporting設置爲0.因此,在腳本開始時,我們將error_reporting設置爲任何值,但是零 - 我們現在可以執行一些美麗的IF/ELSE魔術。爲了避免在前端顯示任何錯誤,我們還將display_errors設置爲0,這將覆蓋error_reporting(但我們仍然可以使用它的值作爲魔術)。

<?php 

ini_set('display_errors',0); 
error_reporting(E_ALL); 

function error_handler($errno, $errstr, $errfile, $errline) 
{ 
    if (error_reporting()===0) return; 
    else die(); 
} 

set_error_handler('error_handler'); 

//This issues an error, but the handler will return and execution continues. 
//Remove the at-sign and the script will die() 
@file(); 

echo 'Execution continued, hooray.'; 
?> 

所以..這裏沒有漁獲物嗎?除了那個外部庫覆蓋我的錯誤處理..(有關於此的任何提示嗎?)

回答

1

考慮到你的腳本和@ operator manual page上的一些用戶註釋,看起來你正在做的事情是OK的。

例如,taras says

我很困惑,以什麼@符號 實際上做,和幾個 實驗後得出的結論的 如下:

  • 錯誤處理程序無論設置了哪個級別的 錯誤報告,或者是否在 聲明的前面加上@

  • 它由錯誤處理程序來給不同的 錯誤級別指定一些含義。即使錯誤報告設置爲 NONE,也可以讓您的 自定義錯誤處理程序回顯所有錯誤, 。

  • 那麼@操作符是做什麼的?它臨時將報告 級別的錯誤設置爲0。如果該行 觸發一個錯誤,錯誤處理程序 仍然會被調用,但它會 調用的0

而且set_error_handler手冊頁的錯誤級別似乎證實:

特別值得注意的是,如果導致錯誤的語句 由@ error-control操作符預置,則此值將爲0。

這裏也有一些用戶註釋可用;例如,this one(查看代碼的開頭)


不過,如果你想要的是「禁用」 @操作(不知道我理解正確的問題的影響;這可能幫助你啦),能夠同時你對你的開發環境,以獲得錯誤信息,您可以安裝尖叫擴展(peclmanual

只要你配置正確的方式,在你的PHP設置此.ini(在安裝/加載擴展程序之後,當然):

scream.enabled = 1 

此擴展將簡單地禁用@運算符。


下面是一個例子(引述manual):

<?php 
// Make sure errors will be shown 
ini_set('display_errors', true); 
error_reporting(E_ALL); 

// Disable scream - this is the default and produce an error 
ini_set('scream.enabled', false); 
echo "Opening http://example.com/not-existing-file\n"; 
@fopen('http://example.com/not-existing-file', 'r'); 

// Now enable scream and try again 
ini_set('scream.enabled', true); 
echo "Opening http://example.com/not-existing-file\n"; 
@fopen('http://example.com/another-not-existing-file', 'r'); 
?> 

,這將輸出:

Opening http://example.com/not-existing-file 
Opening http://example.com/not-existing-file 

Warning: fopen(http://example.com/another-not-existing-file): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in example.php on line 14 


我不知道我會用這個擴展在生產服務器上(我從不想顯示錯誤的地方),但是在使用舊代碼的開發機器上,在使用@操作符extensivly的應用程序/庫上非常有用......

+0

+1。這個確認是我所需要的。尖叫聲的延伸看起來很有用,可能會檢查到。不過在今天的情況下,我只想讓外部庫能夠做到這一點 - 就好像我的應用程序不在那裏一樣。 – 2009-08-16 10:27:51