0

複数のセッターメソッドを一緒にチェーンしようとしています。できればtry-catch ブロックを使用し、デフォルトの Exception クラスを使用して処理する、複数のエラーを解析するクリーンな方法を誰かが知っているかどうか知りたいです。

現在のコードでは、(foo から) キャッチされた最初の Exception オブジェクトしか受け取っていないため、ユーザーに表示できるエラーは 1 つだけです。

任意のポインターまたは規則をいただければ幸いです。

class Test {
   function setName($name) {
      if (empty($name))
         throw new Exception("Name is empty.");

      return $this;
   }

   function setDescription($description) {
      if (empty($description))
         throw new Exception("Description.");

      return $this;
}


try {

   $object->setName("foo")
          ->setDescription("bar");

} catch(Exception $e) {

}
4

5 に答える 5

5

さまざまな例外をキャッチできますが、一度に 1 つしかキャッチできません。例外は単なる警告通知ではありません。例外とは、関数が期待される結果を得ることができず、プログラムが単純に続行できないことを意味します。特定のフィールドに入力しなかったことをユーザーに伝えるために使用することはできません。

そのためには他のテクニックを使用してください。

于 2013-10-02T07:18:49.443 に答える
1

その定義により、複数の例外をスローすることはできません(関数から複数回結果を返せない理由と同様)。

あなたの場合、結果を含む構造を保存できます。これに、クラスの操作のエラーを書き込みます。次に、空でない場合は、収集されたコンテンツで例外をスローします。

于 2013-10-02T07:19:34.510 に答える
0

例外がスローされると、コードが停止し、catch 命令がそれを処理するまで例外がバブルします。

だからあなたがするとき:

   $object->setName("foo")
          ->setDescription("bar");

setName の呼び出しで例外がスローされた場合、2 番目のセッターは呼び出されません。

あなたのケースでは、エラーを自分で処理する必要があります。

class Test {
   private $errors = array();

   function setName($name) {
      if (empty($name))
         $this->errors[] = "Name is empty.";

      return $this;
   }

   function setDescription($description) {
      if (empty($description))
         $this->errors[] = "Description.";

      return $this;
}
于 2013-10-02T07:21:52.350 に答える
0

エラー処理と例外を調べる必要があるかもしれません: 例外は例外的な状況のためのものです。これらは、多くの場合に遭遇する可能性のある状況のように見えます: 予期しない状況が発生した場合、例外をスローして、実行していることをすべて停止します。状態が不明なため、この例外的な状況にあるため、これ以上作業を続けることはできません。

エラーが発生した場合にフローを指示したい場合は、例外に基づいていない何らかのエラーハンドラーを記述して、作業を続行し、エラーをユーザーに報告する必要があります。

これについては読むべきことがたくさんあります。「フロー制御としての例外」の使用に関するリソースと、なぜそれが悪い考えなのかを調べたいと思うでしょう。

于 2013-10-02T07:24:53.350 に答える