要は、関数中で処理を中断せざるを得ない状況が発生し、
それが1つや2つのパターンではなく、多数存在するということかな?
この手の話は、はるか昔から、いろいろ議論されているように思います。
「これだ!」という決定的な方法がないのもまた事実です。
私が思いつく限りのパターンを並べてみます。
1) 関数の戻り値パターン
ErrType Func() // ErrTypeはenum値
{
if() return ErrType_A;
:
if() return ErrType_B;
:
if() return ErrType_C;
:
}
などとして、関数の呼び出し側でエラー内容に応じた処理を行う
2) do_while パターン
do
{
if() { エラー処理(); break;}
:
if() { エラー処理(); break;}
:
if() { エラー処理(); break;}
:
} while(false);
1回しか通らない do while を途中でbreakして抜けるパターン
3) try catchパターン
try catchパターンもありだと思います。
ただし、私がやるなら「1) 関数の戻り値パターン」の変形です。
void Func()
{
if() throw new Exception("A");
:
if() throw new Exception("B");
:
if() throw new Exception("C");
:
}
とし、呼び出し側でtry catchする。
例外というのは、正常系の処理が続けらず、異常系の処理も関数内で
決定することができない場合に投げるものだと思うからです。
自関数内で異常系の処理を確定できるなら、そのようなものは、
例外処理しなくて良い気がします。
(例) ファイルアクセスエラー
File.Open()を呼んでファイルが見つからないと、FileNotFoundException
が発生します。これが、もし例外発生ではなく、関数内で「見つからない」
とメッセージボックスを表示する実装だったとすると、正常系で見つから
ないかもしれないファイルをオープンしにいったときに、メッセージ
ボックスが邪魔になります。
見つからないかもしれないファイルをオープンしにいくことが仕様上あり
得ないなら、関数内でメッセージボックスを表示しても良いわけですが、
その場合、いちいち内部で例外発生させて、catchしてなんてやるのは、
回りくどいわけです。