2009-08-16 13 views
3

これが正しいかどうか教えてください。私のエラーハンドラでは、@エラーコントロールオペレータがエラーを抑制するために使用されたときを検出できる必要があります。なぜなら、いくつかの外部ライブラリ(悲しいことに)がそれを多く使うからです。カスタムエラーハンドラを使用しない場合と同様に、スクリプトの実行を続行する必要があります。エラー制御オペレータの検出

at-signを使用すると、PHPは一時的にerror_reportingを0に設定します。スクリプトの開始時にerror_reportingを0に設定します。これで美しい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(コードの初めを参照)


それでも、何が欲しいのは(わからない私が正しく質問を理解@演算子の影響を「無効」とすると、このかもしれないがあなたのphpでこれを設定すると、あなたは悲鳴の拡張子(peclmanual

あなたはそれを正しい方法を設定提供をインストールすることができ、あなたの開発環境でありながら、エラーメッセージを取得できるようにするには、)とにかくあなたを助けます.ini(もちろん、拡張機能をインストール/ロードした後):

scream.enabled = 1 

この拡張機能は、単に@演算子を無効にします。

<?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 


私は本番サーバー上でこの拡張機能を使用するかわからない


そして、ここでは、(引用manual)の例です(ここで私はエラーを表示したくない)が、@ operator extensivlyを使用するアプリケーション/ライブラリで古いコードを使用すると、開発マシンで非常に便利です...

+0

+1。この確認は私が必要なすべてでした。悲鳴の拡張子は有用であるように見えるかもしれません。しかし、今日のケースではない、私はちょうど私のアプリケーションがそこになかったかのようにそれをすることができるように外部ライブラリをしたい。 –

関連する問題