ちょっとしたエラーなどで例外を投げていいものなのでしょうか?
例外を投げる場合、投げない場合はどのように区別すればいいのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
例外を投げるべきケースとして、いくつか考えてみました。
- メモリやファイル、通信関係など、外部資源に関わってくるケース
こういったものはエラーが当然起きうるものですし、異常が出ても「無視して続行」したい&それが可能なパターンも少ないでしょうから、例外を使って処理するのが適切でしょう。
- プログラムのバグでないと起きないような状態に陥った場合
コンパイル時に型チェックしない言語の場合、明らかに処理不能なオブジェクトが引数となってしまったときは、例外を投げるのが、デバッグ時に異常を知らせる手段として適切でしょう(もっとも、不適切なプロパティやメソッド参照で勝手に例外が飛ぶことも考えられますが)。
- 例外を使うライブラリを内部的に使う場合
この場合、自前で処理できる例外は別として、処理不能な例外は再スローするのが適切と考えます。とはいえ、何もしなくても自動的に上位へ伝わっていくわけですが、それが例外の有利な点とも言えます。
なお、PHPは元がオブジェクト指向でなかったという経緯もあって、SPL系以外のライブラリでは例外を投げず、別枠でエラー処理を行っています。そんなこともあって、PHPでは(例外を多用するようなフレームワーク、ライブラリを使って開発を進める場合はともかく)例外に頼らないほうがいいと考えます。
投稿2015/03/20 08:36
編集2015/03/20 08:39総合スコア146509
0
ベストアンサー
ふふふ、このテーマだけで軽く本を書けちゃいますよ。
ちなみに、言語は何を想定して言っていますか?
(HaskellやMLにおける例外と、C++やJavaにおける例外では、ちょっと考え方に違いがありますのでね。)
投稿2015/03/19 14:31
総合スコア973
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
PHPのことは知りませんが、Rubyは気軽に例外を使って構いませんよ。
(なんていったってbreak
の内部実装が......)
コメントを受けたので追記:
気軽にコードを書いている状態なら気軽に例外を投げて良いと思います。
慎重にコードを書かなくてはいけない状況なら、例外を投げるのも(そしてどのような値を返す場合でも)慎重にすべきです。
投稿2015/03/20 08:02
編集2015/03/20 08:39総合スコア1342
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/03/20 08:10
2015/03/20 08:14
2015/03/20 13:23
2015/03/20 22:37

0
例外を投げることによりthrow以降の処理が飛ばされることになりますが、これを補完するためにcatchの処理が複雑になるようであれば投げるべきではないでしょう。
それでも複数のエラー処理をcatchで効率的にハンドリングできるように書けるのであれば、throwは有効です。throwを多用されているプログラマーはそうしたコーディングをされているかと思います。
それは別としてtry,catchの用法には慣れて積極的に利用した方が良いコーディングになるかと思います。
使用しなければ検知できない事象もありますし、catchにはエラーハンドリングが集約されるので可読性が良いです。catchした例外メッセージをlog出力することでテストにも運用にも有用となるでしょう。
投稿2015/03/20 03:43
総合スコア1339
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
私は、基本的に、エラー処理を一元化するために、例外を使ってます。
ネストされた一番底で、エラーをはかれても、例えるなら、Cを使っているのに、その奥で動作している機械語からエラーが出るようなものなので。
デバック時の利点としては、
Aの呼び出しで問題なく、Bの呼び出しで問題があるなら原因はネストの底ではなくBなど、原因の追及が楽
場合によっては、Bに合わせてネストの底を修正することもできます。
実環境時の利点としては、エラー処理の一元化
ネストの底でいちいちエラー処理を書いていては、実動作を書いているのか、エラー処理を書いているのかわからなくなるようなこともあります。
理解不能な動作になったら、処理を止めて例外を投げる。例外を投げると処理が止まるのも利点ですね。
そして一番上層で、ファイルに出力するなりなんなり。
デバック環境での例外処理は、実環境では、消える、あるいは、動作しないようにかけると尚いいと思います。
>例外を投げる場合、投げない場合はどのように区別すればいいのでしょうか?
対処できるかできないかで分けたらよいと思います。たとえば、1/0 を、ありえないとするか、∞とするかの違いなど、代替案があるなら、投げる必要はない、は言うまでもないですね。
処理を止める必要があるかどうかも指針になると思います。
それ以降を止めて、別処理に移れるのも例外の利点です。
例外を利用するかしないか、という話になると、また別問題ですが
goto や、returan などを駆使すれば、処理を止めて、も可能ですが、嫌われる以前に複雑になりがちですし、読んだ側は、それがエラーなのか何なのかわかりにくいと思います。
便利なら使えばいいですし、エラーオブジェクトの分メモリを消費するというのも、処理によっては考えないといけないですが、重くて落ちそうなときに吐いたエラーをスローするのもどうかと思います。
投稿2015/03/20 14:18
総合スコア81
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。