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

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

0

Exceptionがキャッチされていない?

お世話になっております。

業務で使用しているWEBアプリケーションのソースコードを解析しているのですが、混乱してきたのでお知恵を拝借したく。

以下、ソースです。

public class A{
    public method1{
        try{
            method2();
        }catch(Exception e){
            //メッセージ("A")表示
        }
    }
    public method2 throws Exception{
        classB b = classB();
        try{
             b.method3();
        }catch(Exception e){
            //メッセージ("B:" + e.getMessage())表示
            throw e;
        }
    }
}
public class B{
    public method3() throws SQLException, Exception{
        Exception e = null;
        try{
            //SQL処理など
        }catch(SQLException se){
            e = se;
            throws se;
        }
    }
}

クラスAのmethod2のみで生成しているメッセージが、画面上に「B:null」と表示される時があり、原因調査のためソースコードを追いかけております。
死ぬほど長い上に、意味不明な記述が散見されるソースのため(すみません。愚痴です。)、まずは当たりをつけて気長に取り組むつもりです。(再現性も「あまり」ないようですので。)

で、ソースを見て思ったのはmethod2のcatch節で表示したメッセージはmethod1のcatch節で握りつぶされているはずなのに、なぜ画面に表示されるの?ということです。
(上位メソッドで握りつぶされる運命のmethod2のメッセージ表示処理って何?というツッコミは置いといてください。)
ちなみにメッセージ表示はクラスAのクラス変数にセットすることで行っております。
なお、method2の使用箇所は、全ソースを調査した(つもりかもしれませんが)結果、クラスAのmethod1の1箇所のみで使用していることを確認済みです。

1:method3にてSQLExceptionをスロー
2:method2にてExceptionをキャッチ
3:method2のcatch節にて問題のメッセージを生成
4:method2のcatch節にてキャッチしたExceptionをスロー

この後でmethod1でExceptionをキャッチしていないように見えるのです。

どなたか、何か思い当たる方いらっしゃいましたら回答お願い致します。

それとも他の箇所で同様のメッセージを生成していて、その箇所を見落としているのでしょうか?

そもそもソースコードが、稼働中のモジュールに合致するのかも怪しく思えてきました・・・。

4

回答

5979

閲覧

4件の回答

評価

0

メッセージを出力するのと、呼び出し元で例外を握りつぶす
のは別だと思うんだけど?

//メッセージ("B:" + e.getMessage())表示
って部分が、単なるコメントじゃなくて、メッセージ出力し
ているなら、その時点でメッセージ吐かれちゃってるんじゃ
ない?

評価

0

そこが本当にコメントになってるなら、

1.見ているソースと搭載されているクラスの版が異なる
2.他にも表示している箇所がある

のどちらかだなあ。

評価

0

質問主です。

satomi様、$様
ご回答ありがとうございます。

最初の質問に誤解を招く表現がありましたので、補足させてください。

メッセージの表示についてですが、BEANのメッセージ用フィールドに各メソッドにてメッセージをセットし、JSPからそのBEANを参照する実装となっております。

最初の質問に掲載したソースコード中における
//メッセージ(***)表示
は、それぞれがBEANにメッセージ「***」をセットしている・・・という記述のつもりでした。

伝わらない表現になってしまったことを、お詫び申し上げます。
申し訳ありませんでした。

そういうわけですので、satomi様がご回答くださった
>//メッセージ("B:" + e.getMessage())表示
>って部分が、単なるコメントじゃなくて、メッセージ出力し
>ているなら、その時点でメッセージ吐かれちゃってるんじゃ
>ない?
ということはありません。
メッセージ用のフィールドに各メソッドから値をセットした後で画面表示を行っているため、最後にセットした値が表示されるはずなのです。

$様のおっしゃるように
>1.見ているソースと搭載されているクラスの版が異なる
>2.他にも表示している箇所がある
のどちらか・・・ということかもしれません。

まずは、もう一度全ソースを見直してみます。
ソースとモジュールの版違いについては、事象の再現条件がいまだ判明していないため、検証方法が思いつきません。(ソースの版管理を全くやっていない恐ろしい状況です。)

他に何か思い当たることがございましたら、些細なことでも結構ですので、情報お待ちしております。
よろしくお願い致します。

評価

0

質問主です。

解決しました。
method2のcatch句の後続にfinally句があり、その中のreturnの記述を見落としていました。method2でメッセージ生成後にreturnしているため、method1でExceptionが捕捉されていないのだと気付きました。

つまり、最初に掲載したソースでは事象が再現できないことになります。簡潔に伝えようとするあまり、必要な情報を削ぎ落としていたことになります。

ご意見を頂いたsatomi様、$様には重ねて御礼を申し上げるとともに、深くお詫び申し上げます。お時間をとらせてしまい申し訳ありませんでした。

(事象の根本原因であるclass Bのtry句についてはゆっくり解析していこうと思います。)

お騒がせしました・・・。

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