web-dev-qa-db-ja.com

PHPエラー処理:die()Vs trigger_error()Vs throw Exception

PHP-私が知る限り、3つのスタイルがあることを知っています:

  1. die() or exit()スタイル:

    _$con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
    _
  2. _throw Exception_スタイル:

    _ if (!function_exists('curl_init')) {
    
          throw new Exception('need the CURL PHP extension. 
                               Recomplie PHP with curl');
        }
    _
  3. trigger_error()スタイル:

    _if(!is_array($config) && isset($config)) {
            trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
        }
    _

現在、PHPマニュアルでは、3つの方法すべてが使用されています。

  • 私が知りたいのは、どのスタイルを好むべきか、なぜですか?

  • これらの3つのドロップインは互いに交換されているので、交換可能に使用できますか?

わずかにOT:それは私だけですか、それともPHP開発者を混乱させる程度にPHPエラー処理オプションは多すぎると考えていますか?

114
CuriousMind

最初のものは、エンドユーザーに関係のない情報を転送するため、本番コードでは決して使用しないでください(ユーザーは「データベースに接続できません」)。

特定の重要なコードポイントで、アプリケーションが失敗する可能性があることがわかっている場合に例外をスローし、複数の呼び出しレベルでコードを回復したい場合。

trigger_error()を使用すると、(さまざまなレベルのエラーメッセージを使用して)エラー報告をきめ細かくでき、エンドユーザーからこれらのエラーを非表示にできます( set_error_handler() ただし、テスト中に表示されます。

また、trigger_error()は、開発中に重要でない致命的なメッセージを生成する可能性があり、カスタムエラーハンドラーを使用して製品コードで抑制することができます。致命的なエラーも発生する可能性があります(_E_USER_ERROR_)が、それらは回復不能です。これらのいずれかをトリガーすると、プログラムの実行はその時点で停止します。致命的なエラーの場合、例外を使用する必要があるのはこのためです。これにより、プログラムのフローをより詳細に制御できます。

_// Example (pseudo-code for db queries):

$db->query('START TRANSACTION');

try {
    while ($row = gather_data()) {
       $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
    }
    $db->query('COMMIT');
} catch(Exception $e) {
    $db->query('ROLLBACK');
}
_

ここで、gather_data()がプレーンクローク(_E_USER_ERROR_またはdie()を使用)している可能性がある場合、以前のINSERTステートメントがデータベースに入れられたとしても望ましくなく、次に何が起こるかを制御することはできません。

85
Linus Kleen

通常、開発コードでの簡単なデバッグには最初の方法を使用します。本番環境にはお勧めできません。最良の方法は、例外をスローすることです。例外をプログラムの他の部分でキャッチし、エラー処理を行うことができます。

3つのスタイルは、お互いのドロップイン置換ではありません。最初のエラーはエラーではありませんが、スクリプトを停止し、手動で解析するためのデバッグ情報を出力する方法にすぎません。 2つ目はそれ自体エラーではありませんが、キャッチしなければエラーに変換されます。最後の1つは、PHPエンジンの実際のエラーをトリガーします。これは、PHP環境の設定に従って処理されます(場合によっては、 、他の場合はファイルにログを記録するか、まったく保存しない)。

9
Emil Vikström