Eclipseの「Debug Shell」で出来ることを備忘録的にまとめてみた。
前置きが長くなっちゃったので、時間が無い人は後述の使い方メモだけ読んでね
こんな人向け
・Eclipseを使ってJavaの開発をしている
・デバッグ中に例外を強制発生させたい
・EclipseのDebug Shellでできることを知りたい
前置き(この記事をまとめるきっかけ:例外処理テストをどうやるか)
発端はJavaの開発作業でこんな処理を追加した時だ。
処理内容は適当なので雰囲気で読んでね
// -----------------------------------------------
// 追加したプログラム
// -----------------------------------------------
try {
// 要件としてやりたい処理
result = execute();
} catch (Exception ex) {
// 要件としてやりたい処理に対して、
// 想定しておきたい例外処理(ログにエラー内容記録して処理結果をエラーとするなど)
Logger.writeErr(ex.message);
result = Error;
}
catchブロックに記述した処理をテストしたかった。
細かい状況は省いてざっくり言うと、開発してる環境で普通に動作させても例外発生しないからどうやってテストしようか、という感じだった。
前置きその2(Debug Shellとの出会い)
そこで「Eclipse 例外 強制発生」などとググると「Debug Shell」でのやり方を見つけた。
使い方はここでは割愛するけどおおまかには
例外発生させたい箇所(上記PG例だと「result = execute();」のところ)
でブレークポイントを貼り、
デバッグ中に処理を停止し、
その間にDebug Shellウィンドウで「throw new Exception();」などと記述して実行すると
例外発生させられる(上記例で言うとcatchブロックの動作をテストできる)
というものだった。
前置きその3(Debug Shellいろいろできるじゃん、でもあんま情報出てない)
要するにDebug Shellとは、
例外の強制発生のためのものというよりは
デバッグ停止中にDebug Shellウインドウで自由に処理を記述して実行できるもの、と言えるだろう。
というわけで例外テストのほかにも実はいろいろできる。
例えばDebug Shellウインドウ内で変数を宣言してその変数を引数に任意のメソッドを呼び出したり、
複数行の処理を記述してまとめて実行したり、
とにかくデバッグ停止中に自由に処理を記述して実行できるのだ。
一方で自由とはいっても少しコツがいる。
例えばブレークポイント停止中のPG箇所から参照できるスコープ範囲の変数やメソッドでないと
名前空間をがっつり指定しないと使用できない。当たり前と言えば当たり前だけど。
そういったコツがいるので、Debug Shellでなんとなく記述して実行しても
実行できないことが良くあり、試行錯誤が必要だった。
ある程度開発経験があれば実行時に表示されるエラー内容から
「ああImportしてないクラスだから使えないんだな、めんどいけど名前空間から指定すれば使えるか」
などと感覚的に解決は出来るとは思う。
そのような試行錯誤の過程でDebug ShellについてググったりQiitaの記事を検索したが、いくつかヒットはあるものの例外強制発生の使い方くらいしか見当たらなかった。
(日本語サイトしか見てない。英語ならもっとあるかも)
そこでせっかくなので例外発生だけでなく、他も含めた使い方の例をここに記しておきたいと思う。
使い方をいくつか紹介(というか自分用にメモ)
1. 例外の強制発生
これは前置きでも挙げたやつ。
throw new Exception("テスト");
のようなコードを実行し、例外処理を発生させられる。
2. 任意の変数を宣言
String name = "山田 太郎";
のように任意の変数を宣言できる。
3. 複数のコードを実行
String name = "山田 太郎";
System.out.println(name);
のように記述し、2行ドラッグして実行すると
宣言した変数を後のコードで使用できる。
4. importされている定義を使用
例えばブレークポイントを設定したjavaファイルで
ClassAがimportされている場合、
ClassA a = new ClassA();
のように実行することができる。
5. importされていないクラス定義を名前空間を指定して使用
例えばClassAがimportされていない場合、
ClassA a = new ClassA();
は実行できないが
java.util.ClassA a = new java.util.ClassA();
のように正しい名前空間を指定することで実行できる。
6. 任意のメソッドを実行
ClassA a = new ClassA();
String result = a.execute();
のように、
ブレークポイントの箇所で参照可能なメソッドや
Debug Shellで生成したインスタンスのメソッドを実行できる。
まとめ
特になし。備忘録ですしね。
特にないけどあえて書くなら、例外のテストは大事だけど手間なことが多いので、こういったやり方も押さえておくと良いだろう。