okadabasso
@okadabasso

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

java の例外処理の疑問(特に検査例外)

こんなコードを見た

class Application{
  public void main(String[] args){
  }
  public void foo(){
    FooObject o;
    try{
        o = new FooObject();
    }
    catch(IOException e){
        handleError(e);
    }
    try{
        o.doSomething1();
    }
    catch(IOException e){
        handleError(e);
    }
    try{
        o.doSomething2();
    }
    catch(IOException e){
        handleError(e);
    }
    try{
        o.doSomething3();
    }
    catch(IOException e){
        handleError(e);
    }
    // 以下、なにかやる度にtry catch、ときどき Exception をcatch
  }
  private void handleError(Exception ex){
    // なにかログとかDBの進行状況テーブルをエラーにするとか
  }
}

これって普通のjavaプログラマーにとっては一般的なの?こんなものなの? On Error Resume Next より面倒なんですけど。

これじゃいかんの

  public void foo(){
    try{
        FooObject o;
        o = new FooObject();
        o.doSomething1();
        o.doSomething2();
        // その他処理が続く
    }
    catch(IOException e){
        handleError(e);
    }
    catch(Exception e){
        handleError(e);
        abort(); // 仮の異常終了胥吏
    }
    // 以下、なにかやる度にtry catch、ときどき Exception をcatch
  }

0

5Answer

例外発生しても処理継続するなら個別にcatch。
どこかでエラーになったら処理終了するならまとめてcatch。
そもそもそこでcatchする必要がないなら、例外を握りつぶさずに throws IOException, Exception

1Like

どこで上記のコードを見ましたか?
誰が書いたコードで書いた人がどのくらいの経験を持ったプログラマーかわかりますか?

もしかしたらすごく特殊なコードで、handleError関数の中にグローバル変数を変更するような挙動がしくまれていて、o.doSomething1();がだめだった場合は、グローバル変数を変更して、o.doSomething2();を実行するとかそんなクソコードなのかもしれません。

あと後述のコードだとo.doSomething1()でエラーがでた場合o.doSomething2()が実行されないのでそれはそれで問題だと思います。Javaとか抜きにして。

1Like

他の方も触れられていますが,catchした時点でtryブロック内の処理はすべて中断されてしまうので,処理1でエラーが起こっても処理2を行う場合はブロックを分けなければなりません.

より実用的なところだと

while ((data = br.readLine()) != null) {
  try {
    process(br);
  } catch(Exception e){ /*...*/ }
}

try {
  while ((data = br.readLine()) != null) {
    process(br);
  }
} catch(Exception e){ /*...*/ }

ではフローが異なるのがご理解いただけると思います.
どちらが良いのかはそれこそ入力によってまちまちです.

蛇足ですが,かなり大きめ(これは記述量という意味ではなく,呼び出し階層が高い=関数を内部で大量に呼び出す)のブロックでExceptioncatchするのはデバッグの利便性を下げたり,それこそ「予期しないエラー」を封殺してしまいプログラムが異常動作するきっかけになるので,個人的には忌避すべき習慣だと思ってます.

1Like

例外発生しても処理継続するなら個別にcatch。

そう言えばこういう事例は時々ありますね、完全に失念していました。

0Like

Your answer might help someone💌