- ベストアンサー
C# 例外
C#の例外に関してご質問です。 例外に関して調べてみると、関数の呼び出し元、呼び出し先にも例外処理を書いていました。 呼び出し元に入れとけば呼び出し先に入れり必要がないと考えておりますが、そうでもないのでしょうか? 呼び出し先に入れる理由はどんなのがありますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>呼び出し元に入れとけば呼び出し先に入れり必要がないと考えておりますが、そうでもないのでしょうか? そうではないです。 呼び出し元も、呼び出し先も「自分の事しか考えてない」ので、それぞれで、自分の都合に合わせた、以下のような例外への対応が必要です。 ・パターンA「必要な例外処理は、自分を呼んでくれた呼び出し元でやってくれている」というのが明白な場合。 呼び出し先では、例外処理を書かなくても良い。例外処理は呼び出し元にすべて任せる。呼び出し先は、呼び出し元の例外処理で何が起きるか、一切関知しない。 ・パターンB「必要な例外処理は、自分で処理する必要がある」というのが明白な場合。 呼び出し先では、自分の都合に合わせた例外処理を書く。 但し、自分が対処できない例外は、最初から例外としてキャッチしないか、キャッチした場合は例外を再スローして呼び出し元にすべて任せること。 例えば「例外は、C#のランタイムライブラリがやってくれる例外処理で充分である」と言う場合は、どのルーチンも「必要な例外処理は、自分を呼んでくれた呼び出し元(つまり、ランタイムライブラリのスタートアップルーチン)でやってくれている筈」なのが明白なので、例外処理を一切書かない。 例えば「ゼロ除算だけキャッチして警告を出したい」と言う場合、自分(呼び出し先)の関数内に例外処理を書く。 例えば「呼んだ先でゼロ除算が起きたら呼んだ先で例外処理してくれない」と言う場合、自分(呼び出し元)の関数内に例外処理を書く。 このように「誰に例外処理をさせるか?」により、関数内で例外処理を書いたり書かなかったりする。 これは「呼び出し元で書いてあるから、呼び出し先では要らないよね」という単純な話ではない。
その他の回答 (2)
- nak777r
- ベストアンサー率36% (49/136)
呼出し元の関数では、Aと言う関数、Bと言う関数、Cと言う関数 を呼び出しているものとします。 呼出し元から呼び出された Aという関数はうまくいき、 Bという関数で例外が発生 Cと言う関数は呼び出されずに 呼出し元は、どの関数で例外が発生したかを調査しない為 結果として処理としては必ず中断するしかありません。 呼出し先の関数で例外処理がされている場合、 Aという関数はうまくいき、 Bという関数で、例外が発生 Bは例外の処理で、戻り値に例外発生時の代替値を返す Cという関数は、Bの戻り値(この場合、代替値)で処理を行う 結果として、必ずしも呼出し元の関数は中断しなくても良いという結果になる
お礼
ありがとうございました
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
そういうロジックにするならば、必要があるないという判断は、実装する人で行うべきです。 呼出元で捕捉されるとマズいかどうかは、ロジックを見ないと分かりませんから。 つまり、あなたが見て、あなたが不要だと感じるならば、不要です。 呼出元で捕捉していない例外は、呼出先で捕捉するでしょう。 呼出元で捕捉しているにも関わらず、呼出先で制御を変更させる限定的な例外が存在する場合、その例外は呼出先で捕捉するでしょう。 例外ポリシーをどのように策定して実装しているかで捕捉方法は変わってくるでしょう。
お礼
ありがとうございました