- ベストアンサー
ifとtry
phpやpythonで質問です。 作ったプログラムをサーバーにあげてユーザーが使えるようにしています。 例えば、phpなどではロジックに意図しない値が入力されたらバリデーションなどではじくことができますよね?(pythonも 「意図しない動作や入力」の時ってif文だけではなくtry文を使うときがあるのですが(データペース接続など) 使い分けの方法がわかりません。使い分ける方法、または場面を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
例外処理は、例外とした理由付けをするために使うので、フレームワークやライブラリの設計によります。 データベース接続の場合は、確かに、「接続できなければアプリ落とす」ぐらいの意識となりますね。 例として以下のようなものを記載します。 <?php /* 何らかのテキストを入力された場合に検証するバリデータがあるとして */ class TextValidator { public function execute() { if (/* 選択された文字数が多すぎる場合 */) { throw new MaxLengthException(); } else if (/* 半角しか許可していないのに全角が入力された場合 */) { throw new NotHalfCharactorException(); } else if (/* なんらか不適切な表現があった場合 */) { throw new BadWordException(); } return true; } } // 例えばコントローラ内で $text = $_POST['text']; try { $validator = new TextValidator($text); $validator->execute(); } catch (MaxLengthException $e) { echo "文字数が多すぎます"; } catch (NotHalfCharactorException $e) { echo "半角以外の文字は許可しません"; } catch (BadWordException $e) { // 悪質な言葉をしゃべるユーザなので、ロギングしておく、みたいな。 $logger->log($userid); echo "再度入力してください"; } finally { // 共通処理 } ?> といった感じで、使う側が発生した例外によって細かく制御をすることが可能です。 細かい制御は必要なく、検証結果の真偽だけを問いたい、といった場合、下記にしめすようにラッピングして使いやすくすればよいわけです。 <?php // ラッピングして、例外が発生したら偽、そうでないなら真だけ返す function checkText($value) { $validator = new TextValidator($value); $ret = false; try { $validator->execute(); $ret = true; } catch (Exception $e) { // 継承もとになるような上位のExceptionクラス名をまとめてキャッチ // そして何もしない $ret = false; } return $ret; } $text = $_POST['text']; if (!checkText($text)) { echo "正しい文字を入力してください!"; } ?> また、テストコードなど、なんとなく手元の検証スクリプトとしたとき、キャッチしなければブラウザにエラーが出てくるのでエラー理由を見るのも簡単だったり。 <?php $validator = new TextValidator('test'); $validator->execute(); // execute時点で例外が発生して、かつキャッチしない場合は、その場でスクリプトが即座に止まる。 // if文制御の場合は、elseで抜けた後に後続処理も走ってしまう。。。 ?> ライブラリ制作者側としては、各々の例外処理を個別に設計するが、ライブラリ利用者側で例外をどのようにハンドリングするか簡単に変更できるような使い方ができます。 上記のようなバリデータの場合、戻り値を、連想配列やオブジェクトにして真偽とエラーコードを返す、でももちろん良いわけですが、 独自の戻り値仕様を設計しなくとも、言語使用で吸収できるというのも、作りやすさがあるのかな、と。
その他の回答 (1)
- dell_OK
- ベストアンサー率13% (766/5720)
私は、ライブラリが例外を発生させる場合にはtryを使い、 そうでない場合、つまりライブラリが例外を発生させず、 動作結果を戻り値で返してくれる場合にはifを使います。
お礼
詳しくありがとうございました。