3

これが一般的な慣行であるかどうかを知りたかっただけです。基本的に、コンストラクターは、失敗時にスローされるいくつかの初期化関数を呼び出しています。私の考えでは、実際の出力が送信されている場所であるため、オブジェクトが作成されている場所に例外を再スローすることは理にかなっています。

これは、この種の状況の「ベストプラクティス」ですか? または、これを行うためのより標準的な方法はありますか?

<?php
  class a {   
        private $x;
        private $y;
        function __construct($filename) {
             try {
                 $this->x = $this->functionThatMightThrowException($filename);
                 $this->y = $this->doSomethingElseThatMightThrow();
             }
             catch(InvalidArgumentException $e) {
                  throw $e;    //is this a good practice or not???
             }
             catch(Exception $e) {
                  throw $e;    //again
             }
         }

         //rest of class definition
    }

  // then somewhere else where the object is created and output is being sent
  $fn = "blah.txt";
  try {
    $a = new a($fn);
  }
  catch (InvalidArgumentException $e) {
     //actually handle here -- send error message back etc
  } 
  catch (Exception $e) {
     //etc
  }
?> 
4

1 に答える 1

5

コードのこの部分だけを見てみましょう:

         try {
             $this->x = $this->functionThatMightThrowException($filename);
             $this->y = $this->doSomethingElseThatMightThrow();
         }
         catch(InvalidArgumentException $e) {
              throw $e;    //is this a good practice or not???
         }
         catch(Exception $e) {
              throw $e;    //again
         }

InvalidArgumentException同様に、これはコード重複の典型的なケースであり、それException自体は次のように削減できます。

         try {
             $this->x = $this->functionThatMightThrowException($filename);
             $this->y = $this->doSomethingElseThatMightThrow();
         }
         catch(Exception $e) {
              throw $e;    //again
         }

それが良い習慣かどうかを尋ねる行はなくなりました。したがって、重複コードを削除するためのこの純粋に体系的なアプローチを使用しても、「いいえ、それは良い習慣ではありませんでした」という質問に答えることができると思います。それはコードの重複でした。

その次に-すでにコメントしたように-例外を再スローしても価値はありません。したがって、コードを次のように削減することもできます。

         $this->x = $this->functionThatMightThrowException($filename);
         $this->y = $this->doSomethingElseThatMightThrow();

だから私はこれが役立つことを願っています. コードは以前とまったく同じように動作します。違いはありません。常に歓迎されるコードが少ないだけです。

于 2013-08-20T20:27:48.447 に答える