質問編集履歴

2 微妙追加

nanndemoiikara

nanndemoiikara score 711

2015/09/03 18:12  投稿

try catchの用途【PHP】
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
<?php
defined('BASEPATH') OR exit('のび太さんのエッチ!');
class Api extends CI_Controller{
   function __construct()
   {
       parent::__construct();
       $this->load->model('api_model');
       $this->load->library('form_validation');
   }
   
   public function add_user()
   {
         //POST Request以外は無視
         if ( $this->input->method(TRUE) !== 'POST' ) return show_404();
         $json_str  = $this->input->raw_input_stream;
         //ここform_validationしやすい様に配列で渡す。
         $json_data = json_decode($json_str, TRUE);
         if ( empty($json_data) ) return show_404();
         $this->form_validation->set_data($json_data);
         $this->form_validation->set_rules('name', 'lang:name', 'required|max_length[100]');
         $this->form_validation->set_rules('tel', 'lang:tel', 'required|is_natural|max_length[13]');
         $this->form_validation->set_rules('sex', 'lang:sex', 'required|in_list[1,2]');
         $result = new stdClass;
         try
         {
              if ( $this->form_validation->run() === FALSE )
              {
                   throw new Exception('Request Validation Error', 2);
              }
              if ( ! $this->api_model->add_user($json_data) )
              {
                   throw new Exception('User add Error', 1);
              }
              $result->statusCode = 'success!!!';
              $result->message   = 'ユーザー登録できたっぽいよ!';
         }
         catch ( Exception $e )
         {
             $result->statusCode = 'EA' . $e->getCode();
             $result->message   = $e->getMessage();
             if ( ! empty(validation_errors()) )
             {
                 $result->validationMessages = $this->form_validation->error_array();
             }
         }
         return $this->output
             ->set_content_type('application/json')
             ->set_output(json_encode($result));
   }
}
```
大げさですがifで分岐するパターンです。
```php
<?php
defined('BASEPATH') OR exit('のび太さんのエッチ!');
class Api extends CI_Controller{
   function __construct()
   {
       parent::__construct();
       $this->load->model('api_model');
       $this->load->library('form_validation');
   }
   
   public function add_user()
   {
         //POST Request以外は無視
         if ( $this->input->method(TRUE) !== 'POST' ) return show_404();
         $json_str  = $this->input->raw_input_stream;
         //ここform_validationしやすい様に配列で渡す。
         $json_data = json_decode($json_str, TRUE);
         if ( empty($json_data) ) return show_404();
         $this->form_validation->set_data($json_data);
         $this->form_validation->set_rules('name', 'lang:name', 'required|max_length[100]');
         $this->form_validation->set_rules('tel', 'lang:tel', 'required|is_natural|max_length[13]');
         $this->form_validation->set_rules('sex', 'lang:sex', 'required|in_list[1,2]');
         $result = new stdClass;
         if ( $this->form_validation->run() === FALSE )
         {
              $result->message = 'Request Validation Error';
              $result->statusCode = 'EA2';
              $result->validationMessages = $this->form_validation->error_array();
              return $this->output
                 ->set_content_type('application/json')
                 ->set_output(json_encode($result));
         }
         
         if ( ! $this->api_model->add_user($json_data) )
         {
              $result->message = 'User add Error';
              $result->statusCode = 'EA1';
              return $this->output
                 ->set_content_type('application/json')
                 ->set_output(json_encode($result));
         }
         $result->statusCode = 'success!!!';
         $result->message   = 'ユーザー登録できたっぽいよ!';
         return $this->output
                 ->set_content_type('application/json')
                 ->set_output(json_encode($result));
   }
}
```  
 
 
。。。。微妙。。。。  
```php  
<?php  
defined('BASEPATH') OR exit('のび太さんのエッチ!');  
class Api extends CI_Controller{  
   function __construct()  
   {  
       parent::__construct();  
       $this->load->model('api_model');  
       $this->load->library('form_validation');  
   }  
     
   public function add_user()  
   {  
         $json_data = $this->validation_set_value();  
           
         $result = $this->error_check($json_data)  
         if ( ! empty($result) )  
         {  
              $result = new stdClass;  
              $result->statusCode = 'success!!!';  
              $result->message   = 'ユーザー登録できたっぽいよ!';  
         }  
         return $this->show_output($result);  
   }  
 
  private function show_output(array $result)  
  {  
       return $this->output  
             ->set_content_type('application/json')  
             ->set_output(json_encode($result));  
  }  
 
  private function error_check($json_data)  
  {  
      if ( $this->fvalidation_check($json_data) === FALSE )  
      {  
           $result = $result = $this->err('Request Validation Error', 1);  
       }  
       elseif ( ! $this->api_model->add_user($json_data) )  
       {  
           $result = $this->err('User add Error', 1);  
       }  
      $result;  
  }  
 
  private function err($msg, $code)  
  {  
      $result = new stdClass;  
      $result->statusCode = 'EA' . $e->getCode();  
      $result->message   = $e->getMessage();  
 
      if ( ! empty(validation_errors()) )  
      {  
         $result->validationMessages = $this->form_validation->error_array();  
      }  
      return $result;  
  }  
 
  private function validation_check()  
  {  
         $this->form_validation->set_data($json_data);  
         $this->form_validation->set_rules('name', 'lang:name', 'required|max_length[100]');  
         $this->form_validation->set_rules('tel', 'lang:tel', 'required|is_natural|max_length[13]');  
         $this->form_validation->set_rules('sex', 'lang:sex', 'required|in_list[1,2]');  
         return $this->form_validation->run();  
  }  
 
  private function validation_set_value()  
  {  
         //POST Request以外は無視  
         if ( $this->input->method(TRUE) !== 'POST' ) return show_404();  
         $json_str  = $this->input->raw_input_stream;  
         //ここform_validationしやすい様に配列で渡す。  
         $json_data = json_decode($json_str, TRUE);  
 
         if ( empty($json_data) ) return show_404();  
         return $json_data;  
  }  
}  
```
  • PHP

    38459 questions

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

  • CodeIgniter

    328 questions

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

1 if 分岐パターン追記

nanndemoiikara

nanndemoiikara score 711

2015/09/03 11:42  投稿

try catchの用途【PHP】
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
<?php
defined('BASEPATH') OR exit('のび太さんのエッチ!');
class Api extends CI_Controller{
   function __construct()
   {
       parent::__construct();
       $this->load->model('api_model');
       $this->load->library('form_validation');
   }
   
   public function add_user()
   {
         //POST Request以外は無視
         if ( $this->input->method(TRUE) !== 'POST' ) return show_404();
         $json_str  = $this->input->raw_input_stream;
         //ここform_validationしやすい様に配列で渡す。
         $json_data = json_decode($json_str, TRUE);
         if ( empty($json_data) ) return show_404();
         $this->form_validation->set_data($json_data);
         $this->form_validation->set_rules('name', 'lang:name', 'required|max_length[100]');
         $this->form_validation->set_rules('tel', 'lang:tel', 'required|is_natural|max_length[13]');
         $this->form_validation->set_rules('sex', 'lang:sex', 'required|in_list[1,2]');
         $result = new stdClass;
         try
         {
              if ( $this->form_validation->run() === FALSE )
              {
                   throw new Exception('Request Validation Error', 2);
              }
              if ( ! $this->api_model->add_user($json_data) )
              {
                   throw new Exception('User add Error', 1);
              }
              $result->statusCode = 'success!!!';
              $result->message   = 'ユーザー登録できたっぽいよ!';
         }
         catch ( Exception $e )
         {
             $result->statusCode = 'EA' . $e->getCode();
             $result->message   = $e->getMessage();
             if ( ! empty(validation_errors()) )
             {
                 $result->validationMessages = $this->form_validation->error_array();
             }
         }
         return $this->output
             ->set_content_type('application/json')
             ->set_output(json_encode($result));
   }
}
```  
 
 
大げさですがifで分岐するパターンです。  
```php  
<?php  
defined('BASEPATH') OR exit('のび太さんのエッチ!');  
class Api extends CI_Controller{  
   function __construct()  
   {  
       parent::__construct();  
       $this->load->model('api_model');  
       $this->load->library('form_validation');  
   }  
     
   public function add_user()  
   {  
         //POST Request以外は無視  
         if ( $this->input->method(TRUE) !== 'POST' ) return show_404();  
         $json_str  = $this->input->raw_input_stream;  
         //ここform_validationしやすい様に配列で渡す。  
         $json_data = json_decode($json_str, TRUE);  
         if ( empty($json_data) ) return show_404();  
 
         $this->form_validation->set_data($json_data);  
         $this->form_validation->set_rules('name', 'lang:name', 'required|max_length[100]');  
         $this->form_validation->set_rules('tel', 'lang:tel', 'required|is_natural|max_length[13]');  
         $this->form_validation->set_rules('sex', 'lang:sex', 'required|in_list[1,2]');  
 
         $result = new stdClass;  
         if ( $this->form_validation->run() === FALSE )  
         {  
              $result->message = 'Request Validation Error';  
              $result->statusCode = 'EA2';  
              $result->validationMessages = $this->form_validation->error_array();  
              return $this->output  
                 ->set_content_type('application/json')  
                 ->set_output(json_encode($result));  
         }  
           
         if ( ! $this->api_model->add_user($json_data) )  
         {  
              $result->message = 'User add Error';  
              $result->statusCode = 'EA1';  
              return $this->output  
                 ->set_content_type('application/json')  
                 ->set_output(json_encode($result));  
         }  
 
         $result->statusCode = 'success!!!';  
         $result->message   = 'ユーザー登録できたっぽいよ!';  
         return $this->output  
                 ->set_content_type('application/json')  
                 ->set_output(json_encode($result));  
   }  
}  
```
  • PHP

    38459 questions

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

  • CodeIgniter

    328 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る