- PR -

eclipseデバッグ中に任意の例外を発生させるには

1
投稿者投稿内容
サビオラ
会議室デビュー日: 2003/11/14
投稿数: 6
投稿日時: 2004-01-27 14:55
いつもお世話になっております。

異常系テストにおいて、eclipseのデバッグ中(ブレークポイントで停止している状態)に
任意の例外をスローさせたいのですが、みなさんはどのようにされていますでしょうか?

Google検索で、以下の方法を見つけたのですが、

http://www.egroups.co.jp/message/eclipse-ml/1130

これを試してみると、表示ウィンドウに

評価に失敗しました。理由:
例外が発生しました: java.io.FileNotFoundException

と表示されるのみで、デバックコード上は例外のcatch句内に飛ばず正常に終了してしまいます。

どなたかご存知の方おられましたらご教授願えませんでしょうか?

よろしくお願いします。
Keisuke
大ベテラン
会議室デビュー日: 2003/10/24
投稿数: 105
投稿日時: 2004-01-27 15:20
引用:

評価に失敗しました。理由:
例外が発生しました: java.io.FileNotFoundException


評価したことで例外が発生する(させている)のですから、正しい挙動だと思います。
catch 節の方を見直されては?
サビオラ
会議室デビュー日: 2003/11/14
投稿数: 6
投稿日時: 2004-01-27 15:55
Keisukeさん回答ありがとうございます。

やりたいことがうまく説明できず、十分に伝わらず申し訳ありません。

例えば、下記のようなプログラムにおいて、InterruptedException発生時のテスト
(「//例外処理」で行われるのテスト)をする場合、aaa()呼び出しの部分に
ブレークポイントを設定し、eclipseデバッガ上で強制的にInterruptedException
をスローしたいと思っております。

public class Ttt {

public static void main(String[] args) {


try {
aaa();
} catch (InterruptedException e) {
// <例外処理>
System.out.println("異常終了");
return;
}

System.out.println("正常終了");
}

private static void aaa() throws InterruptedException {

Thread.sleep(1000);
}

}

http://www.egroups.co.jp/message/eclipse-ml/1130
では表示ペインにおいてInterruptedExceptionをスローするクラスを呼ぶことで
catch句の中に処理がくると書いてあるのですが、実際やってみたところ
表示ペイン上に

評価に失敗しました。理由:
例外が発生しました: (スローさせた例外)

と表示されるのみで、デバック中のコード上はcatch句の中に処理がいかず
例外処理のデバックを行うことができませんでした。

上記方法以外にデバッグ中に任意の例外をスローさせる方法があればと思い
投稿させていただきました。

ちなみに環境は、
eclipse2.1.1
OS:Windows2000Pro
JDK:1.3.1
です。

よろしくお願いします。
Keisuke
大ベテラン
会議室デビュー日: 2003/10/24
投稿数: 105
投稿日時: 2004-01-27 16:58
失礼しました。よく見たらうまく行っていませんでした。

やりたい事は理解しております。
コンソールにスタックトレースが出たので、意図どおり動いたものと
勘違いしていました。

Display ペーンで色々試してもサスペンド状態から抜け出すことは
無いようなので、無理な気がします。
またブレークポイントの評価式に細工してみましたがだめなようです。

ちょっと手間ですが、
・ブレークポイントで止ったあと下記のようなコードを挿入。
・Display ペーンにて、debug = true; を実行。
・レジューム
とすることで単発の例外を発行することはできました。

コード:
  boolean debug = false;
○ブレークポイント
  if (debug) {
    Debug.throwException(new Exception());
  }

サビオラ
会議室デビュー日: 2003/11/14
投稿数: 6
投稿日時: 2004-01-27 17:18
Keisukeさん返信ありがとうございます。

Keisukeさんのやられた方法はアプリケーションソースコードを

boolean debug = false;
if (debug) {
  Debug.throwException(new Exception());
}

のように実装し、デバッガで変数値を強制的にtrueにすると言うことでしょうか?

できればアプリケーションソースコードにデバックコードは埋め込むのは避けたい
のですが、eclipseデバッガで追おうする場合そうするしかなさそうですね。

「デバック中に任意の例外を発生」機能はあると便利だと思うのですが、意外に
できないもんなんですね。。。(できるIDEはあるのかな?)

eclipse使用者に限らず、Javaで開発をされている方々はどのようにテスト
されているのか興味深いです。

とりあえず今から昔使っていたForte4jを久しぶりに起動し、上記デバッグが
できるか試してみます。

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

サビオラ
会議室デビュー日: 2003/11/14
投稿数: 6
投稿日時: 2004-01-27 17:18
Keisukeさん返信ありがとうございます。

Keisukeさんのやられた方法はアプリケーションソースコードを

boolean debug = false;
if (debug) {
  Debug.throwException(new Exception());
}

のように実装し、デバッガで変数値を強制的にtrueにすると言うことでしょうか?

できればアプリケーションソースコードにデバックコードは埋め込むのは避けたい
のですが、eclipseデバッガで追おうする場合そうするしかなさそうですね。

「デバック中に任意の例外を発生」機能はあると便利だと思うのですが、意外に
できないもんなんですね。。。(できるIDEはあるのかな?)

eclipse使用者に限らず、Javaで開発をされている方々はどのようにテスト
されているのか興味深いです。

とりあえず今から昔使っていたForte4jを久しぶりに起動し、上記デバッグが
できるか試してみます。

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

mocha
会議室デビュー日: 2003/06/08
投稿数: 3
投稿日時: 2004-12-10 10:59
随分昔のネタなので、もうどうでもよいかもしれませんが、私が実施した方法を以下に書きます。

方法
例外発生のオブジェクトのメソッドが実行される前の場所にブレークを仕掛け、
対象オブジェクトの参照を、例外スローする擬似オブジェクトに張り替える。
対象メソッドが実行されたときは、擬似オブジェクトのメソッドが
例外をスローするので、catch文節に入る。

補足
オブジェクト参照を擬似オブジェクト参照に切り換える場合は、
表示ビューで、参照代入式を書けばよい。
例外catch後、本物オブジェクトに参照を戻す必要がある場合は、
擬似オブジェクトに憶えさせておくなどする。

弱点
・インスタンスが参照変数で参照されていないとダメ。
・擬似オブジェクトに関するコードが存在しないとだめ。

方法としては例外スローメソッドの発想ほど簡単ではないですが、
元ソースコードをいじらずにデバッグ操作だけで例外を発生させられます。
mocha
会議室デビュー日: 2003/06/08
投稿数: 3
投稿日時: 2004-12-10 11:00
随分昔のネタなので、もうどうでもよいかもしれませんが、私が実施した方法を以下に書きます。

方法
例外発生のオブジェクトのメソッドが実行される前の場所にブレークを仕掛け、
対象オブジェクトの参照を、例外スローする擬似オブジェクトに張り替える。
対象メソッドが実行されたときは、擬似オブジェクトのメソッドが
例外をスローするので、catch文節に入る。

補足
オブジェクト参照を擬似オブジェクト参照に切り換える場合は、
表示ビューで、参照代入式を直接書けばよい。
例外catch後、本物オブジェクトに参照を戻す必要がある場合は、
擬似オブジェクトに憶えさせておくなどする。

弱点
・インスタンスが参照変数で参照されていないとダメ。
・擬似オブジェクトに関するコードが存在しないとだめ。

方法としては例外スローメソッドの発想ほど簡単ではないですが、
元ソースコードをいじらずにデバッグ操作だけで例外を発生させられます。
1

スキルアップ/キャリアアップ(JOB@IT)