人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP5で例外を投げる際、以下のように例外コードを指定できますが、例外コードを利用した有用な使い道がありましたら教えてください。

try {
throw new Exception('メッセージ', 例外コード);
} catch (Exception $e) {
}

●質問者: wankodon
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● holoholobird
●34ポイント

http://www.objective-php.net/basic/exception
を読む限り、エラー時のメッセージをcatchブロックにまとめられるのがメリットのようですね


wankodonさんのコメント
遅くなりましたが回答ありがとうございます。

2 ● SPANIEL
●33ポイント

PHP に限らず、例外機構のメリットは大きく二つあります。

  1. 通常の処理の見通しが良くなること
  2. 問題が起きたときのリカバリ処理を確実に行えること

サブルーチンやメソッドで処理に失敗したときには、それをハンドリングする処理が必要です。
例外機構が無いプログラムでは、戻り値で判定するしかありませんでした。

$ret = func1(...);
if ($ret != 0) {
$msg = ...
Logger::write($msg);
exit(100);
}

$ret = func2(...);
if ($ret != 0) {
$msg = ...
Logger::write($msg);
exit(100);
}

$ret = func3(...);
if ($ret != 0) {
$msg = ...
Logger::write($msg);
exit(100);
}

見て分かる通り、コードの大半をエラー処理が埋め尽くしています。
エラー時のメッセージを残して処理を終了するだけでこんな感じですから、RDB を扱う処理のように後始末が必要な場合には、本来の処理が読みにくくなり保守性が下がります。

/* 本来の処理の流れ */
func1(...);
func2(...);
func3(...);

特に対処しているエラーが滅多に出ないものだと何が大事なのかがよく分からなくなってしまいます。
これが関数が例外を送出するように作ると、以下のように記述することができます。

try {
func1(...);
func2(...);
func3(...);
} catch (Exception $e) {
$msg = $e->getMessage();
Logger::write($msg);
exit(100);
}

コードの追いやすさの差は歴然です。
さらにもうひとつメリットがあってエラーを通知するメッセージの組み立てを隠ぺいできることです。
特に大規模な開発だと各処理の結合度を疎にすることがとても大切ですが、最初の例だとエラーメッセージの組み立て、つまりどのパラメータをどのように使っているかを想定しながらエラー処理を書いているわけで、関数内部の処理のロジック変更が呼び出しているコードにまで影響を与えるということになります。
例外機構を使った場合には、その処理も例外を送出する方に押し込める(隠ぺいする)ことができるのでモジュール間の結合度を疎に保ち変更があったときの影響度合いを減らすことができます。


もうひとつのリカバリ処理についてです。
例えば、データベースで複数のテーブルに一貫性が必要な更新をするときのことを想像してください。
全てのテーブルについて更新が成功した場合には最後に COMMIT 、ひとつでも失敗したら ROLLBACK です。
finally 節も含めて以下のようになります。

$db = new PDO(...);

try {
 $db->beginTransaction();


/*
ここにも複雑な処理が入る
*/

$pnn = $db->prepare('INSERT INTO ...');
$pnn->bindParam(...);
$pnn->execute();

/*
ここにも複雑な処理が入る
*/

$pnn = $db->prepare('INSERT INTO ...');
$pnn->bindParam(...);
$pnn->execute();

 ...

$db->commit();

} catch (PDOException $e) {
 try {
$db->rollBack();
} catch (Exception $e2) {
// 多分何もできない
}

} finally {
 try {
$db->close();
} catch (Exception $e3) {
// 多分何もできない
}
}

DB への書き込みのパラメータを求めるために複雑な処理が入ったり、さらにサブルーチンで処理をされたりします。
その際に例外機構を使っておくと問題が起きたときの後始末(ここでは ROLLBACK )が抜けることがありません。
より確実な動作を例外機構が約束してくれます。


これは PHP に限らず例外機構を持つプログラム言語に共通して言えることです。


wankodonさんのコメント
遅くなりましたが詳しい回答有り難うございました。 参考にさせて頂きます。

3 ● boost_beast
●33ポイント

http://www.shigeweb.jp/php/project_p/?page=exception&section=php5oop
こちらを見てみてください。


wankodonさんのコメント
回答どうも有り難うございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ