Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

(try...catch 文)catch ブロックからの抜け方について

初めてこちらの掲示板を利用させてもらいます。
RA といいます、よろしくお願いします。




try {
    return aaaa(xxxxx);
}
catch (ex) {
    String code;
    if ("01".equals(ex)) {
        code = "MM01";
    }
    else if ("02".equals(ex)) {
        code = "MM02";
    }
    else {
        throw ex;
    }
    throw (Exception)
        new Exception(code, *****);
}

例えば上記のような処理をしている実装があったとして、
throw された ex が 03 のときに catch ブロックから(ex は破棄して)抜けたい場合は
どのような実装になるのでしょう。

#03 のときには
#>             throw (Exception)
#>                 new Exception(code, *****);
#の処理をしたくない場合です。
#※if 文の中である条件の時 break で抜けるというようなイメージですかね…。

また、そうする為には別の実装方法がありそうでしたら、
ご教示いただければ幸いです。
よろしくお願いいたします。

5

回答

10607

閲覧

5件の回答

評価

0

まずはねぇ、コンパイルできる例を載せようよ。
で、本題だけど、返す値をどこから取ってくるかが問題だよね。
nullを返していいのなら、
try {
    ...
} catch (Exception ex) {
    ...
    else if ("03".equals(ex.getXxx()))
        return null;
    ...
}
のような感じでOK

評価

0

こういうのも考えられるね。

try {
    try {
        return aaaa(xxxxx);
    } catch (XxxException ex) {
        // "03"じゃなかったら再スロー
        if (!"03".equals(ex.getXxx())
            throw ex;
        // "03"の場合の処理
    }
} catch (XxxException ex) {
    ...
}

あとは、根本的な問題を解決する方法として、例外階層を見直す、ってのがあるねぇ。

評価

0

if文をネストしてみては?
if(ex == 3){
    //何もしない
}
else{
    if(ex == 1){
        //処理
    }
    else{
        //処理
    }
    throw new Exception();
}

呼び出し元は03の例外を知らなくていいってことですよね。

評価

0

> さん1
> まずはねぇ、コンパイルできる例を載せようよ。

失礼しました。
全部載せると逆に迷惑になりそうな量だったので、
どう抜き出せばよい(=コンパイルできる)のかがわからず、
例として変更し、抜粋させていただきました。

> nullを返していいのなら、

説明不足でしたが、自分のケースでは null は返せません。
しかし、こういう実装方法もあるということが
わかっただけでも感謝です。ありがとうございます。


> さん2
>         // "03"の場合の処理

#throw された ex が 03 のときに catch ブロックから(ex は破棄して)抜けたい
と書いたように、"03"の場合の処理はしたくないのです。
(="03"の場合は何もしないで catch ブロックを抜けたい)

try {
    try {
        return aaaa(xxxxx);
    } catch (XxxException ex) {
        // "03"じゃなかったら再スロー
        if (!"03".equals(ex.getXxx())
            throw ex;
        // "03"の場合の処理は何もしない。
    }
} catch (XxxException ex) {
    ...
}

こう書いた時に内側の catch ブロックで ex が "03" のときに
そのままスルーされません。
(return が無いとのことで、コンパイルが通りません)

> あとは、根本的な問題を解決する方法として、例外階層を見直す、ってのがあるねぇ。

これについては今調査中です。
ありがとうございます。


>ことぶきさん
> if文をネストしてみては?

自分の例で書くと、こんな感じでしょうか?

try {
    return aaaa(xxxxx);
}
catch (ex) {
    String code;
    if ("03".equals(ex)) {}
    else{
        if ("01".equals(ex)) {
            code = "MM01";
        }
        else if ("02".equals(ex)) {
            code = "MM02";
        }
        throw (Exception)
            new Exception(code, *****);
    }
}

> 呼び出し元は03の例外を知らなくていいってことですよね。

申し訳ありません。
「呼び出し元は03の例外を知らなくていい」
が何を意味するのかがわかりません。

※同じ意味になるのかわかりませんが、「"03"の場合の処理はしたくない」です。

----------------------------------------

そもそも、戻り値が必要なメソッド内の try...catch において、
catch ブロックから何もしないで抜けるということ自体が無理なのでしょうか。
 さんがおっしゃった、例外階層を見直すしかないんでしょうか。

"03" はそもそも例外として catch しないというような作りに変えて
実装してみます。

ご意見ありがとうございました。

評価

0

try{
......
}
のなかで03というエラーが発生したときに、
どうしたいのか、何を返したいのかを明確に定義しなければ問題は解決できないのではないでしょうか?

・03というエラーが発生しても、無視してtry{...}の中の処理を続けたい。
 (例)
 try{
  // 何か処理
  ......
  try{
   // 03のエラーが発生するかも知れない処理
   ......
  }catch(ex){
   if ("03".equals(ex)) {
    // 03のエラーなら何もしないです。
   }else{
    // 03以外のエラーならそのまま投げ直します。
    throw ex;
   }
  }
  // 処理続行
  ......
  return 何か;
 }catch......

 こんな感じに、03のエラーだけ内部で握りつぶしてしまうというのも一つの手ですね。
 この場合、03のエラーが起きたときは何もせず、それ以外のエラーだと外側のcatch句でcatchされることになります。

・03というエラーが発生したときは、そのエラーを上(呼び出し元)の階層にそのまま渡す。
 この考え方は
 >"03" はそもそも例外として catch しないというような作りに変えて実装してみます。
 と言うことになりますかね。
 catchしなければそのまま上に投げられますので。

・03というエラーが発生したときは、特定の返り値を返す。
 例えば03エラーが発生したら -1 を返すなど。
 try{
  // 何か処理
  ......
  return 何か;
 }catch(ex){
  if ("03".equals(ex)) {
   // 03のエラーなら-1を返します。
   return -1;
  }else{
   // 03以外のエラーならエラー処理をします。
   ......
  }
 }

そんな感じで、メソッドのデザインとして03のエラーが起きたときにどういった動作を期待するか、を明確にしてみましょう。
それによって実装も変わってくると思います。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。