web-dev-qa-db-ja.com

エラーは悪い習慣を抑制していますか?

SO私が尋ねた質問 ここ について不明なコードについての質問で、誰かが "BTW、そこに恐ろしいコードがあります:エラー抑制記号(@)を使用していますたくさん。」

これが悪い習慣である理由はありますか?以下のようなもので:

$db=@new mysqli($db_info) or die('Database error');

、カスタムエラーメッセージのみを表示できます。エラーを抑制しなくても、典型的なPHPメッセージが表示されます:

警告:mysqli :: mysqli():php_network_getaddresses:getaddrinfo failed:No such Host is known。 some\file\path6行目

「データベースエラー」と同様。

エラー抑制は常に悪いですか?そうであれば、上記の具体的に何が悪いですか?

更新:私が使用している実際のコードは:

or error('Datatabase error', 'An error occurred with the database' . (($debug_mode) ? '<br />MySQL reported: <b>' . $db->error . '</b><br />Error occurred on line <b>' . __LINE__ . '</b> of <b>' . __FILE__ . '</b>' : ''))

以前の出力をすべて削除し、エラーメッセージを表示します。したがって、エラーメッセージに具体的に何が起こったのかに関する詳細が含まれていないという事実(人々がエラーの抑制が悪い理由として示唆しているように思われる)は無関係です。

14
user107146

独自のエラー処理を実装しているため、エラーを抑制して正しいことをしていると思います。

Javaなどでは、同等のものを検討する方が簡単かもしれません。 @を使用してエラーを抑制することは、例外を飲み込むことに似ています。次のコードは、あなたのコードに似ていますが、妥当です。

try {
    db = new MySQLi(dbInfo);
} catch (SQLException connectionFailure) {
    die("Database error");
}

(まあ、Javaでは、サーブレットエンジンを死なせたくないでしょうが、あなたはそのアイデアを得ます。)

ただし、これは受け入れられません。

try {
    db = new MySQLi(dbInfo);
} catch (Exception e) {
}

ほとんどのPHPエラーの抑制は、後者の例と同様に、不注意に行われるため、コードに対する意地悪な反応です。

14
200_success

すでに知っている情報を非表示にするだけではないため、エラー抑制は不適切です(何かが間違っていました)。また、(whatwhereおよびwhy)に気づいていないデバッグに不可欠な情報を隠すこともあります。

この特定の例では、「データベースエラー」はあまり適切なエラーメッセージではありません。 DBに問題が発生しました。あまり啓蒙的ではありません。 「警告:mysqli :: mysqli():php_network_getaddresses:getaddrinfo failed:そのようなホストは不明です。 6行目のsome\file\path内」は実際には、より適切なエラーメッセージです。問題の場所と理由がわかります。エラーが既に検出されているため、すぐにジャンプしてデバッグを開始できます。

もちろん、ライブラリの設計者は、多くの無関係な警告を出す傾向があります。わからないPHP興味のない警告をフィルタリングする方法があるかどうかを知るには十分によくわかります。100行のスタックトレースを読むのはあまり賢明ではありません。しかし、情報が多すぎる場合の正しい応答は、情報量をzeroに減らすことではなく、ある段階で無関係な部分を除外することです。@演算子には、この細分性がありません(モットーです) is all or nothing)であるため、効果的なエラー管理に適したツールではありません。

特定のエラーwillが発生し、実際の問題を修正することは、メッセージを沈黙させること(およびそれによる潜在的な影響)にかかるよりもコストがかかることがわかっている場合があります。これは1回限りのスクリプトの場合に当てはまる可能性がありますが、指を耳に突き刺して「la la la」とするのはnot(潜在的な)バグに対する専門家の対応です。

7
amon

エラーを抑制することは問題を隠すため、悪いことです。多くの場合、私たちも気づいていないことであり、財務、健康、防衛の分野で使用されるアプリケーションなど、一部の重要なアプリケーションで非常にコストのかかる予期しない動作が発生する可能性があります。

エラーメッセージは通常、コードについて多くのことを明らかにし、悪意のあるユーザーやハッカーの操作に役立つ可能性があるため、セキュリティ上の問題が発生する可能性があるため、コードに未処理の例外を設定し、実際のエラーメッセージをユーザーに表示することもお勧めできません。システム。

そのため、さまざまなレベルでエラーを処理することをお勧めします。たとえば、最高レベルでは、実際のエラーをログに記録し、ユーザーにわかりやすいメッセージを表示するだけでエラーを処理できます。

0

はい、エラー抑制演算子は一般的に悪い考えです。

構成(php.ini)でエラー報告を管理する必要があります。したがって、環境ごとに異なる設定を選択できます(たとえば、警告を開発中に残して、本番環境で非表示にするなど)。

@を使用する唯一の状況は、他の開発者のためにライブラリを開発するときです。警告を生成する何かを自発的に選択し、ライブラリのユーザーに依存しない警告でライブラリのユーザーを困らせたくない場合は、@が解決策になる可能性があります。

他の用途は考えられません。

0
lortabac