2011-09-11 16 views
13

私は良いプログラミング方法に従っており、PHPエラーをユーザーに表示せずにファイルに記録しています。私はset_error_handler()を使っています。今@エラー抑制演算子とset_error_handler

問題。たとえば、私はどこかにいる:

しかし、エラー抑制オペレータにもかかわらず、エラーメッセージログ。私はそれを望んでいない。抑止されたエラーが私のエラーハンドラに渡されないようにしたい。

+2

'@'は使用しないでください。その良い兆候は、あなたが何か間違っていて、それを修正したくないということです。しかし、文自体が '@ 'を介して「サイレンス」されていても、errorhandler-callbackが呼び出されます。 – 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; 
} 

も自動的にファイルまたはsyslogにエラーを記録するために、log_errorserror_logオプションを見てみましょう。

+0

したがって、基本的には、@ **一時的に** error_reportingをゼロに設定していると言っていますか? –

+0

はい、これは何ですか。 – arnaud576875

+1

ありがとう、これはまさに私が**尋ねた**です。それは完全にそれを行います。 –

2

実際には@オペレータの使用を避ける必要があります。まず第一に、それは遅く、私はそれを有害と呼ぶ限りです。

php.iniファイルには何があなたの代わりに持っている必要がありますしている2つのライン:

error_repoting = E_ALL | E_STRICT 
display_errors = Off 

...または、あなたはその後、index.phpをの上部に、php.iniファイルへのアクセス権を持っていない場合(または他のブートストラップファイル)を追加する必要があります。

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

私はwounder ..なぜ私はdownvoteを得たか..それはスペルですか? –

+1

私はdownvoteをしませんでしたが、@使用を避けると言っても、その質問には答えません。 PHPはいつか例外をスローして捕まえることができます。捕まえられない愚かな通知を表示することもあります。その場合、アプリケーション全体のエラーをオフにすることは合理的な解決策ではありません。その場でサイレンシングするのは理想的ではありませんが、(特にエラーの場合はfalseを返すfile_existsやfile_get_contentsの場合は特に注意する必要はありません)。理想的には、PHPはエラーを報告する方法で壊れませんが、それを処理する必要があるためです。 –