[解決済み] PHPのエラー処理: die() vs trigger_error() vs throw Exception
質問
PHPのエラー処理についてですが、私の知る限りでは3つのスタイルがあります。
-
die()
またはexit()
のようなスタイルになります。$con = mysql_connect("localhost","root","password"); if (!$con) { die('Could not connect: ' . mysql_error()); }
-
throw Exception
のスタイルになります。if (!function_exists('curl_init')) { throw new Exception('need the CURL PHP extension. Recomplie PHP with curl'); }
-
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
ステートメントが、たとえ望まれていないとしても、あなたのデータベースに入り、次に何が起こるかをコントロールすることができなくなります。
関連
-
[解決済み] ベリログ・ノンネット値割り当て
-
[解決済み] Golang で exec.Command を実行したときの "exit status 1" エラーをデバッグする方法
-
[解決済み] VB6でVarTypeが返すvbErrorとは何ですか?
-
[解決済み] PHPで「Header already sent」エラーを修正する方法
-
[解決済み] PHPで有用なエラーメッセージを得るにはどうしたらよいですか?
-
[解決済み] PHPはエラーログをどこに保存するのですか?(PHP 5, Apache, FastCGI, および cPanel)
-
[解決済み】 `throw new Error` と `throw someObject` の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン