- ベストアンサー
多重ループから例外で抜け出す方法について
- PHP5.2.4を使用して、多重ループから抜け出す方法について教えてください。
- 同じ処理を繰り返し行い、特定の条件が満たされた場合にループを抜けたいです。
- 例外を使って抜け出す方法があるのか、別のやり方があるのか知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 エラーの種類を分ける事は、わかりやすくていい事だと思います。 あまり細かく分けると使いにくいですが・・・。 その前に、例外を使用するのは、例外時だけという事に注意してください。 要件的に、その後の処理は続行する必要があるのか、処理を中止するのか・・・。 単純にcatchして判定し、普通に処理を続行したいとう事でしたら、例外ではありません。 (ただ、ループから出たいためなど・・・) 本来はこうなるべきところが、そうならなかった・・・、というのが例外だと思います。 処理が続けられないようなエラーという意味で・・・。 なので、サンプルの場合はExceptionでいいと思いますが、場合分けは必要だと思います。 私は個人的に、Exception使う派ですが、 Exception=処理中止 という概念で使っています。 (エラー画面に飛ばすぐらいの処理はありますが・・・)
その他の回答 (2)
- taka451213
- ベストアンサー率47% (436/922)
こんばんは。 済みません・・・回答があいまいでしたね・・・。 >普通にbooleanを返して判定する方がよさそうですが・・・。 この後の処理が、ご質問のように、単純に処理を終わるのなら、これでいいと思います。 私はサンプルと判断しましたので、このように回答しました。 >そのように思われるのは、オーバーヘッドを考慮してのことなのか >それとも単に設計的なことなのでしょうか? オーバーヘッドを考慮した結果です・・・。 (特にPHP限定で・・・) >__FILE__と__LINE__については何も意図するところはありません。 >ただ消し忘れてました・・・ それならいいと思います。 要件的に必要でないのなら&処理を停止させるなら、Exceptionでいいと思います。 PHPでExceptionを返すような組み込み関数は最近のものが多いので、可読性や汎用性を考慮したら、別の意見も出るかも知れません・・・。
お礼
ご回答ありがとうございます。 >オーバーヘッドを考慮した結果です・・・。 >(特にPHP限定で・・・) ということは、PHPは他の言語に比べてそのオーバーヘッドが大きい方なのでしょうか? >PHPでExceptionを返すような組み込み関数 たしかに今回の処理($valueが0以下になったら)以外にも例外があるかもしれませんし、 throw new ValueRangeException('valueが0以下になった'); } catch (ValueRangeException $vre) { みたいにしてそれ以外の例外と区別させた方がいいですかね。。
- taka451213
- ベストアンサー率47% (436/922)
こんばんは。 個人的には、使い方が間違えているとは思いません。 ただほとんどの言語は、Exceptionから復帰させるのは、オーバーヘッドが大きいです・・・。 何が正しいのかという議論は、いろいろな意見が合って、正解はないと思います。 単純に好みの問題かと・・・。 普通にbooleanを返して判定する方がよさそうですが・・・。 __FILE__と__LINE__は表示していますが、これだと、$iや$jが幾つの時にエラーになったのかはわかりません。 まぁ、要件次第ですが・・・。
お礼
ご回答ありがとうございます。 >普通にbooleanを返して判定する方がよさそうですが・・・。 そのように思われるのは、オーバーヘッドを考慮してのことなのか それとも単に設計的なことなのでしょうか? 自分としては、さらにこのような処理がちらばったり、さらにメソッドの階層が深くなった場所で public function function1() { $this->subFunction1() } public function subFunction1() { $this->subValue(20); } 判別して抜け出すことを考えるときつくなるというか、 そのような数が増えるしたがってbooleanで判別するのは現実的でないような気がするのですが。。 とはいえ今回知らされたオーバーヘッドのことも含めて例外の本当のって言ったらあれですけど 使い方を良く理解してないので迷ってる段階なのですが・・・
補足
すいません、補足を利用させてください。。 __FILE__と__LINE__については何も意図するところはありません。 ただ消し忘れてました・・・ print $e->getMessage()."\n"; これだけでいいですね
お礼
ご回答ありがとうございます。 たしかに例外って想定外のエラーってことですもんね。 なんとなくですが仰りたいことは理解できました。参考になりました。