2009-06-10 5 views
16

私は、例外的にすべてのPHPエラーをグローバルに変換することは悪い習慣と考えられているのだろうかと思っていました。次のようなものを使用することになります。PHP - すべてのエラーを例外に変換する - 良いか悪い?

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
    return false; 
} 

私は仮定があなただけの通常のエラーをスローするコードの特定の部分を中心に「/キャッチを試みる」を使用して始めることができるということであると仮定します。

それは良い/悪いの場合ではない場合は、このような行為から生じうるその落とし穴のいくつかは何ですか?

答えて

8

残念ながら、これは致命的/解析/などでは機能しません。エラー...

は正確に覚えていないが、私はこれを試してみましたが、いくつかのケースでのようなメッセージが持っている「回避策なしに例外をスローすることはできませんが...」しかし、私は取得する条件を思い出すことができませんこの結果。しかし、今私はこの方法を使用し、完全に満足しています。

+0

この回答は、少なくとも受け入れられた時点で、ほとんどの質問を理解しているようです。私は自分の質問に答えることを軽蔑しますが、私は後で戻ってくるかもしれません。 –

2

本当にあなたのコントロールを超えているものについては、例外を使用してください。

良い:悪い

try { 
    if (fopen('file.txt', 'w') === false) { 
     throw new Exception('File could not be opened for write access.'); 
    } 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 

:ときに何かのユーザーやアプリケーションカント制御、それが発生するため

try { 
    if (strlen($_POST['username']) < 5) { 
     throw new Exception('Username too short'); 
    } 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 

最初の方法が良いです。それはファイルを開くことができません?多くの理由があります。

第二の方法は、あなたがでtrigger_errorを使用する必要があるのtry/catchの過剰使用です。 2番目の方法は、ユーザがユーザ名検証のルールを知らないことです。あなたはどのようなあなたのテストを制御カント短い使用例外で

。覚えておいてください。例外はもっと多くのオーバーヘッドを持っていますし、trigger_errorもあります。

+1

通常、ユーザーに表示するだけのエラーと、ログに記録するエラーがあり、ユーザーには表示されません。このような "内部エラー#123。サポートに連絡してください。"このモデルでは、例外クラスはこの結果を達成するためにかなり形式化されています。したがって、1番目の例はログに記録する必要がありますが、ユーザーの2番目の例はieでなければなりません。 SystemExceptionとUserException ... 2番目のexapmleが "過剰使用"かどうかはわかりません。 – Jet

+0

最初は過度のようには見えないかもしれませんが、パフォーマンスの問題について考える必要があります。オブジェクトは、例外が発生するたびに作成されます。それ自体は遅いわけではありませんが、それはどこでも、trigger_errorのようなものを呼び出すほど早くはありません。 2番目の例ではtry catchは必要ありません。ただ、追加のオーバーヘッドと、このようなページは、一日あたりのヒット数千を受信したときに、パフォーマンスの低下が顕著である:) 私は個人的に私はそれのための使用を参照してくださいいけないので、キャッチを試みる使用することはありません。 – Ozzy

+6

2013はこちらですコンピュータリソースはもはや問題ではありません。例外の使用に対するあなたの唯一の懸念が新しいオブジェクトである場合、間違ったプログラミング言語を使用している可能性があります。 – Gajus

1

Java/.Netではこれまで数年間働いていましたが、近年ではphpになりました。アプリケーションレベルのエラー、クラスのエラー、システムエラーなど、あらゆるものに適しています。各ライブラリ/機能が異なり、エラーを処理するため

私は本当に、エラーの種類のすべての並べ替えを管理しようとする際に仕事のかなり多くを投資しています。

関連する問題