質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Q&A

解決済

3回答

5231閲覧

try catchの用途【PHP】

nanndemoiikara

総合スコア775

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

0グッド

5クリップ

投稿2015/09/03 00:39

編集2015/09/03 09:12

try catchの用途が適切であるかわかりません。
PHPでアプリケーション開発を行う際、try catchをほぼ使います。
try catchがどのような動きをするかはわかっています。

下記はCodeIgniterのコントローラなのですが、バリデーションエラー等を全てthrowしてcatch内でエラー用の画面を表示させたりリダイレクトで飛ばしたりするような設計で開発してしまいます。
オープンソースのコード等を読んでいると、この様にtry catchを使っているコードをあまり見た事がありません。

エラー時の処理が楽だし見やすいと思っているのでこの様な書き方をしているのですが
何か問題点があるのでしょうか?
また、参考記事のC++だとパフォーマンスが悪くなるみたいな
他言語の情報でもご教授頂けますと幸いでございます。

参考記事:http://www.thinkridge.com/modules/tinyd1/content/index.php?id=7

php

1<?php 2defined('BASEPATH') OR exit('のび太さんのエッチ!'); 3class Api extends CI_Controller{ 4 function __construct() 5 { 6 parent::__construct(); 7 $this->load->model('api_model'); 8 $this->load->library('form_validation'); 9 } 10 11 public function add_user() 12 { 13 //POST Request以外は無視 14 if ( $this->input->method(TRUE) !== 'POST' ) return show_404(); 15 $json_str = $this->input->raw_input_stream; 16 //ここform_validationしやすい様に配列で渡す。 17 $json_data = json_decode($json_str, TRUE); 18 if ( empty($json_data) ) return show_404(); 19 20 $this->form_validation->set_data($json_data); 21 $this->form_validation->set_rules('name', 'lang:name', 'required|max_length[100]'); 22 $this->form_validation->set_rules('tel', 'lang:tel', 'required|is_natural|max_length[13]'); 23 $this->form_validation->set_rules('sex', 'lang:sex', 'required|in_list[1,2]'); 24 25 $result = new stdClass; 26 try 27 { 28 if ( $this->form_validation->run() === FALSE ) 29 { 30 throw new Exception('Request Validation Error', 2); 31 } 32 33 if ( ! $this->api_model->add_user($json_data) ) 34 { 35 throw new Exception('User add Error', 1); 36 } 37 38 $result->statusCode = 'success!!!'; 39 $result->message = 'ユーザー登録できたっぽいよ!'; 40 } 41 catch ( Exception $e ) 42 { 43 $result->statusCode = 'EA' . $e->getCode(); 44 $result->message = $e->getMessage(); 45 46 if ( ! empty(validation_errors()) ) 47 { 48 $result->validationMessages = $this->form_validation->error_array(); 49 } 50 } 51 return $this->output 52 ->set_content_type('application/json') 53 ->set_output(json_encode($result)); 54 } 55}

大げさですがifで分岐するパターンです。

php

1<?php 2defined('BASEPATH') OR exit('のび太さんのエッチ!'); 3class Api extends CI_Controller{ 4 function __construct() 5 { 6 parent::__construct(); 7 $this->load->model('api_model'); 8 $this->load->library('form_validation'); 9 } 10 11 public function add_user() 12 { 13 //POST Request以外は無視 14 if ( $this->input->method(TRUE) !== 'POST' ) return show_404(); 15 $json_str = $this->input->raw_input_stream; 16 //ここform_validationしやすい様に配列で渡す。 17 $json_data = json_decode($json_str, TRUE); 18 if ( empty($json_data) ) return show_404(); 19 20 $this->form_validation->set_data($json_data); 21 $this->form_validation->set_rules('name', 'lang:name', 'required|max_length[100]'); 22 $this->form_validation->set_rules('tel', 'lang:tel', 'required|is_natural|max_length[13]'); 23 $this->form_validation->set_rules('sex', 'lang:sex', 'required|in_list[1,2]'); 24 25 $result = new stdClass; 26 if ( $this->form_validation->run() === FALSE ) 27 { 28 $result->message = 'Request Validation Error'; 29 $result->statusCode = 'EA2'; 30 $result->validationMessages = $this->form_validation->error_array(); 31 return $this->output 32 ->set_content_type('application/json') 33 ->set_output(json_encode($result)); 34 } 35 36 if ( ! $this->api_model->add_user($json_data) ) 37 { 38 $result->message = 'User add Error'; 39 $result->statusCode = 'EA1'; 40 return $this->output 41 ->set_content_type('application/json') 42 ->set_output(json_encode($result)); 43 } 44 45 $result->statusCode = 'success!!!'; 46 $result->message = 'ユーザー登録できたっぽいよ!'; 47 return $this->output 48 ->set_content_type('application/json') 49 ->set_output(json_encode($result)); 50 } 51}

。。。。微妙。。。。

php

1<?php 2defined('BASEPATH') OR exit('のび太さんのエッチ!'); 3class Api extends CI_Controller{ 4 function __construct() 5 { 6 parent::__construct(); 7 $this->load->model('api_model'); 8 $this->load->library('form_validation'); 9 } 10 11 public function add_user() 12 { 13 $json_data = $this->validation_set_value(); 14 15 $result = $this->error_check($json_data) 16 if ( ! empty($result) ) 17 { 18 $result = new stdClass; 19 $result->statusCode = 'success!!!'; 20 $result->message = 'ユーザー登録できたっぽいよ!'; 21 } 22 return $this->show_output($result); 23 } 24 25 private function show_output(array $result) 26 { 27 return $this->output 28 ->set_content_type('application/json') 29 ->set_output(json_encode($result)); 30 } 31 32 private function error_check($json_data) 33 { 34 if ( $this->fvalidation_check($json_data) === FALSE ) 35 { 36 $result = $result = $this->err('Request Validation Error', 1); 37 } 38 elseif ( ! $this->api_model->add_user($json_data) ) 39 { 40 $result = $this->err('User add Error', 1); 41 } 42 $result; 43 } 44 45 private function err($msg, $code) 46 { 47 $result = new stdClass; 48 $result->statusCode = 'EA' . $e->getCode(); 49 $result->message = $e->getMessage(); 50 51 if ( ! empty(validation_errors()) ) 52 { 53 $result->validationMessages = $this->form_validation->error_array(); 54 } 55 return $result; 56 } 57 58 private function validation_check() 59 { 60 $this->form_validation->set_data($json_data); 61 $this->form_validation->set_rules('name', 'lang:name', 'required|max_length[100]'); 62 $this->form_validation->set_rules('tel', 'lang:tel', 'required|is_natural|max_length[13]'); 63 $this->form_validation->set_rules('sex', 'lang:sex', 'required|in_list[1,2]'); 64 return $this->form_validation->run(); 65 } 66 67 private function validation_set_value() 68 { 69 //POST Request以外は無視 70 if ( $this->input->method(TRUE) !== 'POST' ) return show_404(); 71 $json_str = $this->input->raw_input_stream; 72 //ここform_validationしやすい様に配列で渡す。 73 $json_data = json_decode($json_str, TRUE); 74 75 if ( empty($json_data) ) return show_404(); 76 return $json_data; 77 } 78}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

参考にされている記事はかなり古いので、そのまま鵜呑みにしない方が良いと思います。

計測に使っている、Visual C++6 は、例外処理機構が良くなかったので、とても遅かったのは確かです。現在でも条件分岐よりは遅いですが、気にする程かどうかは、微妙です。
試しにgcc 4.9.2でそこのプログラムを実行すると、例外処理は 1.54s、条件分岐は0.11s になりました。

これがソースコードの可読性を犠牲にしてまで求めるパフォーマンスかどうかは、その時次第だと思います。

例外処理で気をつけなければならないのは、catch漏れだと思います。
Javaなどでは、コンパイラがある程度教えてくれますが、IDEが貧弱な言語だと、プログラマーの裁量に寄るところが大きいです。
私はPHPのIDEには詳しくないですが、catch漏れを防ぐ仕組みがなければ、よく起こりうるエラーに例外は使わない方が良いのではないでしょうか。

投稿2015/09/03 01:13

shanxia

総合スコア1038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanndemoiikara

2015/09/03 01:27

ご回答ありがとうございます。 > 試しにgcc 4.9.2でそこのプログラムを実行すると、例外処理は 1.54s、条件分岐は0.11s になりました。 ありがとうございます。勉強になります。 > これがソースコードの可読性を犠牲にしてまで求めるパフォーマンスかどうかは、その時次第だと思います。 そうですよね。。。。 > 私はPHPのIDEには詳しくないですが、catch漏れを防ぐ仕組みがなければ、よく起こりうるエラーに例外は使わない方が良いのではないでしょうか。 私自身特にIDEの指定が無い限りはIDEは使わずvimを使用していますが、catch漏れで困った事は無いんですよね。。。 IDEによってですと、開発環境を統一していないかつ複数人で開発するアプリケーションの場合はあまりこういった記述はしない方が良いでしょうか?
shanxia

2015/09/03 02:06

catch漏れで困るのは、常駐型PGMの場合がほとんどなので、phpがCGIなどで使われているならば、むしろ例外を外にthrowした方がわかりやすいかもしれませんね。 これは私がPHPだということを考慮しなかった回答でしたね。申し訳ないです。 C++作った物だと、標準エラー出力に例外情報を表示して、いきなり落ちるので、障害発生時の調査が非常に難航したりしてしまいます。
nanndemoiikara

2015/09/03 03:37

> catch漏れで困るのは、常駐型PGMの場合がほとんどなので、phpがCGIなどで使われているならば、むしろ例外を外にthrowした方がわかりやすいかもしれませんね。 > これは私がPHPだということを考慮しなかった回答でしたね。申し訳ないです。 > C++作った物だと、標準エラー出力に例外情報を表示して、いきなり落ちるので、障害発生時の調査が非常に難航したりしてしまいます。 いえ、ご回答頂きありがとうございます。 C++ではそうなるんですね。勉強になります。 レビューして頂けるのがC++出身の方だと 「なんだこのクソコードは!!」と思ってしまう可能性がありえるという事ですね ((((;゚Д゚))))
nanndemoiikara

2015/09/11 00:31

一番 + が多いかったのでこちらをベストアンサーとさせて頂きます。 ご回答頂きありがとうございました。
guest

0

頻繁に起きることが予測されるような部分で例外をスローしないというのが、プログラミングの作法としてあるので使用しないほうが賢明です。パフォーマンスがどうしても良くないというのは、どの言語でも最新版のでも変わらないと思います。

パフォーマンスのことだけでなく、可読性にも問題があります。

関数の呼び出しでいくつもの階層を深めていった部分でまれに出る例外を処理したい場合に便利なのが、try,throwです。その場で、if文で分岐して数行で処理できるようなことをcatch にまとめる意味は薄いです。

ここの場合では、catchの中身を、次ようなメソッドに移します。

private function err($result, $message, $code) {}

この関数を呼び出して処理させます。

$this->err($result, 'Request Validation Error', 2);

このようにprivate functionで処理をさせるのが通常の感じだと思います。
tryのインデントも不要になり、catchの中身が分離するので、プログラムの可読性がアップするでしょう。

投稿2015/09/03 02:16

mocats

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanndemoiikara

2015/09/03 03:30

ご回答頂きありがとうございます。 > 頻繁に起きることが予測されるような部分で例外をスローしないというのが、プログラミングの作法としてあるので使用しないほうが賢明です。 そうなんですか。。。 PSR-1とかどこかのコーディング規約で決まっているものでしょうか? CakePHPだと下記のURLの様にExceptionクラスが用意されていたので入力エラーなどでもExceptionでも良いかなと思っておりました。 http://book.cakephp.org/2.0/ja/development/exceptions.html > パフォーマンスのことだけでなく、可読性にも問題があります。 パフォーマンスは悪くなると思うのですが、可読性が良くなると思うんですよね。 理由は後述(※1)します。 > 関数の呼び出しでいくつもの階層を深めていった部分でまれに出る例外を処理したい場合に便利なのが、try,throwです。 > その場で、if文で分岐して数行で処理できるようなことをcatch にまとめる意味は薄いです。 そうですよね。 その為にControllerに記述する様にしています。 library model内のExceptionも拾えるので。。。 例が悪く申し訳ございません。 > ここの場合では、catchの中身を、次ようなメソッドに移します。 > private function err($result, $message, $code) {} > この関数を呼び出して処理させます。 > $this->err($result, 'Request Validation Error', 2); > このようにprivate functionで処理をさせるのが通常の感じだと思います。 > tryのインデントも不要になり、catchの中身が分離するので、プログラムの可読性がアップするでしょう。 そうなんですね。 ただ、controllerにprivate methodでエラー処理はあまり定義したくないです。 (※1) 1コントローラでCRUDを書く事もあるのですがC U D のprivate errをそれぞれ定義すると可読性が落ちてしまう気がするのです。
mocats

2015/09/03 06:39

> PSR-1とかどこかのコーディング規約で決まっているものでしょうか? 規約以前の問題ですね。例外というのは、「例」の「外」にあるから例外なのです。基本的に想定外の事象を処理することを目指します。何割という感覚であらかじめ予想される事象ならきちんと処理を書くことです。道具の目的をはき違えている気がします。 http://book.cakephp.org/2.0/ja/development/exceptions.html にあるエラーはむしろthrowを使うケースパターンとして参考になります。これらは予期しないエラーに対しての定義です。 > ただ、controllerにprivate methodでエラー処理はあまり定義したくないです。 申し訳ないはっきり言わせていただくと、これも、若干本来の目的を見失っている感覚です。もしこのような感覚でプログラミングされるのであれば、controllerがクラスである意味が無くなってしまいます。 extends CI_Controller というように、クラスを継承して独自クラスを構築する意味というのは、そこにそこだけで利用する関数を次々と付け足していくという利便性があればこそです。そのために、privateというアクセス制御機構もそろっています。恐れずに、どんどんと関数を追加していってください。 ちなみに、メソッドの行数を制限する規約が存在します。だらっと一つのメソッドにプログラムを書くことは行儀が悪いとされています。メソッドの行数が多すぎると警告を出すIDEもあります。まず、private functionに分割するというのを基本的習慣にしましょう。 public function add_user() はコメント含めて30行以上ありますが、functionに分けて10行以下にまとめてみると、また一段上のスッキリたコードができますよ。やってみてください。
nanndemoiikara

2015/09/04 01:13 編集

ご返信頂きありがとうございます。 > 規約以前の問題ですね。例外というのは、 「例」の「外」にあるから例外なのです。 >基本的に想定外の事象を処理することを目指します。 言葉遊びでしたら一応、「入力が通る前提」としての「例外」という解釈もできるかと思うのですが。。。 > 何割という感覚であらかじめ予想される事象ならきちんと処理を書くことです。道具の目的をはき違えている気がします。 > http://book.cakephp.org/2.0/ja/development/exceptions.html > にあるエラーはむしろthrowを使うケースパターンとして参考になります。これらは予期しないエラーに対しての定義です。 そうなんですか? public function view($id) { $post = $this->Post->findById($id); if (!$post) { throw new NotFoundException('この Post は見つかりませんでした'); } $this->set('post', $post); } このコードのidが削除されたユーザーのIDである可能性は「例外」ということでしょうか? それでしたら入力エラーも例外ではないでしょうか。。。? > ちなみに、メソッドの行数を制限する規約が存在します。だらっと一つのメソッドにプログラムを書くことは行儀が悪いとされています。 > メソッドの行数が多すぎると警告を出すIDEもあります。まず、private functionに分割するというのを基本的習慣にしましょう。 メール送信部分のロジックをprivate _send_mailというメソッドを作って分けたりすのは見やすくなると思うのですが「private err」は無いと思います。。。 1コントローラでCRUDを書く事もあるのですがC U D のprivate errをそれぞれ定義するとメソッド量が多くなり可読性が落ちてしまう気がするのですが。。。 > public function add_user() > はコメント含めて30行以上ありますが、functionに分けて10行以下にまとめてみると、また一段上のスッキリたコードができますよ。やってみてください。 libraryでしたらもっともだと思うのですがControllerですよ? 追記しました メソッド名は適当につけたので気にしないでいただきたいのですが10行以下にまとめて書いて見ましたがひどいコントローラになった様に思います。 publicメソッドが複数定義されているときはあり得ない記述だと思います。
mocats

2015/09/03 13:18

メソッドに分割したコードを読みました。「微妙」とご自身の判断ですが、方向性としてめちゃくちゃいいじゃないですか!当初はerr()だけの分離と思っていたのですが、その他の機能も分離してみたようで、真面目さがにじみ出ています。ものすごくプロっぽいかっこいい形になってきていると思いますよ!(外注で指示したコードも、いつもこんな風に帰ってくればいいのに・・・プロのくせに!) このように、関数で細かくすると複数のコントローラーで使いまわされているプログラムの分離も行いやすくなり、単体テストに乗せたりすることもしやすくなっていきます。 例えば、 function show_output() ですがjsonでアウトプットするという機能として他のコントローラーでも有用になる可能性も見えてきます。別に量産されたメソッドは、ここだけのものでなくても良いんです。どこかにまとめて置くことも視野に入ってきます。メソッドが多くなればさらにそれらをクラスに分離することもできます。そこまで行うことができたら、「実は、この機能にはもっと設定しなけらばならないこともあった」となった時に、変更が一か所で済みます。色々とやれることが見えてきます。 提示されたコードはいくつかバグがあるようですが、この調子でprivateのプロパティ利用やメッセージ文の定数化なども行ってみてください。そして、すべての関数の先頭にコメントを書きましょう。 /** * コメント * @param $var 説明 */ という形式で書いておくのも、今風の「作法」になっています。ここまでできれば、かなり完全な姿になります。 > このコードのidが削除されたユーザーのIDである可能性は「例外」ということでしょうか? > それでしたら入力エラーも例外ではないでしょうか。。。? 「ユーザーのID」は通常のフローの中では存在することが前提となっているものとしての位置づけだと思います。その前提が崩れていると例外と判断するという区分けで問題ないと思います。一方、ユーザー入力では(ユーザー入力とみなして良いんですよね?)誤った入力があるということを前提に処理をしないといけないです。ユーザーに「どこどこの入力がありません」、などの案内文の表示する必要があったりして、処理フローを定義しないといけないです。 もしそうじゃない、その値が入るもの前提のプログラムなら、例外としても良い場合であったかもしれません。 > メール送信部分のロジックをprivate _send_mailというメソッドを作って分けたりすのは見やすくなると思うのですが「private err」は無いと思います。。。 すべてのコントローラーにerr()を付けるということが最終回答ではないです。(そうなってしまっているプログラムも見かけますが・・・) 最終的には、ここで抽出されたメソッドはさらに別の場所、アプリケーション固有のメソッドの集まりの部分に集めることが理想ですね。 > 1コントローラでCRUDを書く事もあるのですが うーむ、これは恐らくもっとダメなパターンですね。プログラムがズラーっとダダ書きされているんですよね。もしそうでしたら、ぜひ、それらをクラスに分離してみてください。 > libraryでしたらもっともだと思うのですがControllerですよ? Controllerならfunctionを付けていけないという感覚はどこから来たのかわかりませんが、そもそもオブジェクト指向とはそういうものです。ぜひ、メソッドが並んでいる状況がかっこいいという感覚になってください。 ・・・かっこいいという感覚は得難いとしても、無駄に定義された変数を見つけ出したり、よりよいアルゴリズムを思いつきやすくなるなどのメリットを実感できるまでになれば良いですね。
nanndemoiikara

2015/09/08 09:27 編集

ご回答ありがとうございます。 > メソッドに分割したコードを読みました。「微妙」とご自身の判断ですが、方向性としてめちゃくちゃいいじゃないですか!当初はerr()だけの分離と思っていたのですが、その他の機能も分離してみたようで、真面目さがにじみ出ています。ものすごくプロっぽいかっこいい形になってきていると思いますよ!(外注で指示したコードも、いつもこんな風に帰ってくればいいのに・・・プロのくせに!) > このように、関数で細かくすると複数のコントローラーで使いまわされているプログラムの分離も行いやすくなり、単体テストに乗せたりすることもしやすくなっていきます。 どう考えても、微妙じゃないですか。。。 外注に指示したコードがこんなコードになって帰ってきたら発狂します。 何度も書かせて頂いていますが、これ、MVCのControllerですよ? もしかしてではございますが、MVC フレームワークをお使いになった事はないのではないでしょうか? > 例えば、 > function show_output() > ですがjsonでアウトプットするという機能として他のコントローラーでも有用になる可能性も見えてきます。別に量産されたメソッドは、ここだけのものでなくても良いんです。どこかにまとめて置くことも視野に入ってきます。メソッドが多くなればさらにそれらをクラスに分離することもできます。そこまで行うことができたら、「実は、この機能にはもっと設定しなけらばならないこともあった」となった時に、変更が一か所で済みます。色々とやれることが見えてきます。 変更が一ヵ所で済むのはわかるのですが、show_outputってどちらかと言えばhelperじゃないですか? なぜController内に入れる必要があるのでしょうか? もしくはどうしても使い回したいのであればcoreのCI_Controllerのオーバーライドで実装するかだとは思いますけど。。。 > 提示されたコードはいくつかバグがあるようですが、この調子でprivateのプロパティ利用やメッセージ文の定数化なども行ってみてください。そして、すべての関数の先頭にコメントを書きましょう。 /** * コメント * @param $var 説明 */ > という形式で書いておくのも、今風の「作法」になっています。ここまでできれば、かなり完全な姿になります。 もしかしてではございますが、あなたの言っている「作法」は「あなたの会社のコーディングルール」もしくは「俺のルール」では。。。。 アノテーションはmodelやlibraryにはつけますがcontrollerのpublicメソッド にはあまり書きません。 メッセージ文の定数化は必要ありません。 Languageクラスを使用すれば良いと思います。 > 「ユーザーのID」は通常のフローの中では存在することが前提となっているものとしての位置づけだと思います。その前提が崩れていると例外と判断するという区分けで問題ないと思います。一方、ユーザー入力では(ユーザー入力とみなして良いんですよね?)誤った入力があるということを前提に処理をしないといけないです。ユーザーに「どこどこの入力がありません」、などの案内文の表示する必要があったりして、処理フローを定義しないといけないです。 大変恐縮ですが ・MVC フレームワークを使用された事が無いのではないでしょうか? ・もしくは、コードを読んでいないのではないでしょうか? URIセグメントの値が入ると思うんですが。。。 > もしそうじゃない、その値が入るもの前提のプログラムなら、例外としても良い場合であったかもしれません。 そうですね。 この質問では、その「良い場合」の明確なパターンが知りたいのですが。。。 > すべてのコントローラーにerr()を付けるということが最終回答ではないです。(そうなってしまっているプログラムも見かけますが・・・) 全てのControllerではなく全てのエラー表示が必要なpublicメソッドになるかと思うのですが。。。 > 最終的には、ここで抽出されたメソッドはさらに別の場所、アプリケーション固有のメソッドの集まりの部分に集めることが理想ですね。 MVCってご存知でしょうか? > うーむ、これは恐らくもっとダメなパターンですね。プログラムがズラーっとダダ書きされているんですよね。もしそうでしたら、ぜひ、それらをクラスに分離してみてください。 著名な人でも1 ControllerでCRUDを記述されている方はいくらでもいるのですが。。。 Controllerを| C | R | U | D |で分割する必要があるときは分割しますが、滅多に無いと思います。 特殊な環境でご活躍されているのですね。 > Controllerならfunctionを付けていけないという感覚はどこから来たのかわかりませんが、そもそもオブジェクト指向とはそういうものです。ぜひ、メソッドが並んでいる状況がかっこいいという感覚になってください。 Controllerならfunctionをつけてはいけない等と書いた覚えは無いです。 privateメソッドを複数定義するぐらいならhelperかlibraryでやれと思ってしまうだけです。 MVCで開発された経験が無いのでは? >・・・かっこいいという感覚は得難いとしても、無駄に定義された変数を見つけ出したり、よりよいアルゴリズムを思いつきやすくなるなどのメリットを実感できるまでになれば良いですね。 そうですね。。。。
guest

0

例外はまさに「例外」なので、

  • プログラムミスやバグ(そもそも関数の引数が想定した形式でない、想定外のヌルポインタなど)
  • DBやファイル、ネットワークといった外部リソースの状態が想定外になっている
  • メモリ不足などの、処理系内部の異常
  • そもそも例外を投げるように作ってあるライブラリ

といった、まさに「異常事態」に対応するためのものです。フォームバリデーションの失敗は「異常」かといえばそうでもなく起きうるものですので(どちらかと言えばビジネスロジックに含まれうる)、例外で対応するのには少し違和感があります(もちろん、人間が値を入れるのを前提としない、Web APIであればまた違うとは思いますが)。

投稿2015/09/03 02:00

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanndemoiikara

2015/09/03 02:42

ご回答頂きありがとうございます。 > まさに「異常事態」に対応するためのものです。 > フォームバリデーションの失敗は「異常」かといえばそうでもなく起きうるものですので(どちらかと言えばビジネスロジックに含まれうる)、例外で対応するのには少し違和感があります そうですよね。。。その通りだと思います。 一応、「入力が通る前提」としての「例外」という解釈で 自分を納得させようとしているのですが 自分自身、質問のtry catchでご回答頂きました通りの違和感があります。 しかし、都度 ifで分けて redirectだったり表示させたりというものだと ・可読性がtry catchより悪い気がする ・効率的でない ・分岐させてFat Controllerになるぐらいならtry catchで書いてしまおう という思考に至ってtry catchしてしまうのです。。。 (ちょっと大げさな記述になってしまいましたが分岐するパターンのコードを記載しました。) >(もちろん、人間が値を入れるのを前提としない、Web APIであればまた違うとは思いますが)。 例題がAPIで申し訳ございません。 通常の人間が入力するフォームでも上記の様にエラー処理も考えております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問