1. ホーム
  2. error-handling

[解決済み] PHPのエラー処理: die() vs trigger_error() vs throw Exception

2022-08-05 18:15:25

質問

PHPのエラー処理についてですが、私の知る限りでは3つのスタイルがあります。

  1. die() または 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つのドロップインは、互いに置き換え可能なものですか?

少しオトボケ:私だけでしょうか、それとも誰もが PHP のエラー処理オプションは単に 多すぎる であり、PHP 開発者を混乱させると考えていませんか?

どのように解決するのですか?

最初のものは、エンドユーザーには無関係な情報を転送することになるので、プロダクションコードでは決して使われてはいけません (ユーザーは "Cannot connect to database" ).

例外を投げるのは、ある重要なコードポイントにおいて、アプリケーションが が失敗する可能性がある で、コードが複数のコールレベルにわたって回復するようにしたい場合です。

trigger_error() を使えば、(さまざまなレベルのエラーメッセージを使うことで)エラーの報告を細かく設定でき、エンドユーザーからこれらのエラーを隠すことができます(たとえば set_error_handler() を使って)エンドユーザーには隠しますが、テスト時には表示させることができます。

また trigger_error() は、開発中に重要な非致命的メッセージを生成することができ、カスタムのエラーハンドラを使用してプロダクションコードで抑制することができます。致命的なエラーも生成することができます ( E_USER_ERROR ) を生成することもできますが、これらは回復不可能です。これらのエラーの一つを発生させると、プログラムの実行は が停止します。 となります。このような理由から、致命的なエラーにはExceptionを使用する必要がある。こうすることで、プログラムの流れをよりコントロールすることができます。

// 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 ステートメントが、たとえ望まれていないとしても、あなたのデータベースに入り、次に何が起こるかをコントロールすることができなくなります。