独自ライブラリを提供する場合は、メソッド内で発生する複数の例外を独自ライブラリの例外へ置き換えて投げるように設計することがあります。例えば、ログインクラスライブラリを独自に作成した場合は、「ログインに失敗しました」といった例外を投げるように設計し、内部的に使っているファイルシステムやデータベース管理システムへのアクセスで発生する例外をそのまま投げるということはしません。このとき、何が原因で例外が発生したのかを把握できるようにしておきたいことが多いでしょう。そんなときは、次のSampleException3のようにThrowableを引数に持つコンストラクタを用意します。
public class SampleException3 extends Exception {
public SampleException3(Throwable cause) {
super(cause);
}
}
次にSampleException3クラスの動作を確認して理解するために、Sample340クラスを作成してみましょう。
public class Sample340 {
private Sample330 sample = new Sample330();
public boolean login(String name, String password)
throws SampleException3 {
try {
return sample.login(name, password);
} catch (SampleException e) {
throw new SampleException3(e);
} catch (SampleException2 e) {
throw new SampleException3(e);
}
}
}
このサンプルでは、Sample330クラスのloginメソッドで発生した例外をすべてSampleException3クラスの例外に置き換えています。ここで、例外の発生原因となった情報はSampleException3クラスのコンストラクタへパラメータとして渡しているので、Sample330クラスが投げる例外をキャッチするメソッド側でも例外の発生原因を把握することができます。
どのように把握できるかを見るために、Sample340クラスを使うプログラムを作成してみましょう。例えば、次のSample341クラスのようなプログラムで確認することができます。これはSample331クラスと同様の処理をするプログラムですが、Sample340が投げる例外はSample330が投げる例外とは違うため、出力結果は変わります。
public class Sample341 {
public static void main(String[] args) {
String[] users = { "Sara", "Akira", "Akira", "Jacky", " " };
String[] passwords = { "? ", "777", "111", "abc", "xyz" };
Sample340 sample = new Sample340(); // Sample340クラスを使用
for (int i = 0; i < users.length; i++) {
try {
System.err.print("i=" + i + ":");
boolean isLogin = sample.login(users[i], passwords[i]);
if (isLogin) {
System.err.println("ログインに成功しました。(" + users[i] + ")");
} else {
System.err.println("ログインに失敗しました。");
}
} catch (SampleException3 e) { // 例外のキャッチはSampleException3だけ
e.printStackTrace();
}
System.err.println("");
}
}
}
このプログラムを実際に実行して結果を見てみると、SampleException3の例外が投げられたことに加えて、何が原因で例外が発生したのかも出力されることが確認できます(画面4)。
Copyright © ITmedia, Inc. All Rights Reserved.