- 追加された行はこの色です。
- 削除された行はこの色です。
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
Eclipseにはエラー情報を表示するエラー・ログビューがありますが、そのビューの使い方です。
[[エラーログの制御>Eclipse/プラグイン開発のTIPS集/エラーログの制御]] で、エラーが発生したときのロギング、またそのログを表示するためのエラー・ログビューについて書きました。次はエラーをユーザに通知するエラーダイアログ機能を調べてみました。
#contents
#ref(error.png)
エラー・ログビュー
~
#ref(detail.png)
その詳細画面
**エラーログについて [#i27db08d]
***使い方 [#m6e1e7cf]
このビューにエラー内容を表示するには以下の記述をすればよいようです。
IStatus status = new Status(IStatus.ERROR, SamplePlugin
.getPluginId(), IStatus.OK, "メッセージ",
new Exception("エラーメッセージ"));
SamplePlugin.getDefault().getLog().log(status);
2行目のlogメソッドが呼ばれたときに、与えられたstatus(IStatusの実装クラス)オブジェクトの内容をログに出力します。Statusオブジェクトはエラーなどの状況を格納したクラスです。コンストラクタの引数の意味は以下の通り。
/**
* Creates a new status object. The created status has no children.
*
* @param severity the severity; one of <code>OK</code>, <code>ERROR</code>,
* <code>INFO</code>, <code>WARNING</code>, or <code>CANCEL</code>
* @param pluginId the unique identifier of the relevant plug-in
* @param code the plug-in-specific status code, or <code>OK</code>
* @param message a human-readable message, localized to the
* current locale
* @param exception a low-level exception, or <code>null</code> if not
* applicable
*/
public Status(int severity, String pluginId, int code,
String message, Throwable exception)
さて、エラー・ログビューは重要度やメッセージなどの項目がありますが、各項目はStatusオブジェクトの値に対応してるみたいです。具体的には以下のような対応になっています。
-重要度:Statusの第1引数。上の例だとIStatus.ERROR
-メッセージ:Statusの第4引数。上の例だと"メッセージ"
-プラグイン:Statusの第2引数。上の例だとSamplePlugin.getPluginId()
-日付:ログ出力をした日付。
-例外スタック・トレース:Statusの第5引数のstackTrace。上の例だとnew Exception("エラーメッセージ")のstackTraceです。
-セッション・データ:??よくわかんなかったです。
このようにログに出力したい内容をStatusに格納してあげればよいわけですね。
***MultiStatusを使う [#p93fc9a7]
MultiStatusとは、複数のエラーを同時に扱う場合に使用するStatusの拡張クラスです。このクラスは内部に複数のStatusクラスを格納することができます。具体的なコードは以下の通り。
MultiStatus mStatus = new MultiStatus(SamplePlugin
.getPluginId(), IStatus.OK, "マルチステータスのメッセージ",
new Exception("マルチのエラーメッセージ"));
IStatus status = new Status(IStatus.ERROR, SamplePlugin
.getPluginId(), IStatus.OK, "メッセージ1", new Exception(
"エラーメッセージ1"));
mStatus.add(status);
status = new Status(IStatus.INFO, SamplePlugin.getPluginId(),
IStatus.OK, "メッセージ2", new Exception("エラーメッセージ2"));
mStatus.add(status);
SamplePlugin.getDefault().getLog().log(mStatus);
この出力結果は以下のようになります。
#ref(multi.png)
*さらに、ダイアログの制御 [#h2d968b6]
**エラーダイアログの制御方法について [#f9f575af]
[[エラーログの制御>Eclipse/プラグイン開発のTIPS集/エラーログの制御]] で、エラーが発生したときのロギング、またそのログを表示するためのエラー・ログビューについて書きました。次はエラーをユーザに通知するエラーダイアログ機能を調べてみました。EclipseはStatusオブジェクトを使用したエラーダイアログ表示機能があります。エラーダイアログは、
EclipseはStatusオブジェクトを使用したエラーダイアログ表示機能があります。エラーダイアログは、
org.eclipse.jface.dialogs.ErrorDialog
というクラスを用います。
やり方は簡単で、[[エラーログの制御>Eclipse/プラグイン開発のTIPS集/エラーログの制御]]で出てきたMultiStatusのオブジェクトを使って
やり方は簡単で、[[エラーログの制御>Eclipse/プラグイン開発のTIPS集/エラーログの制御]]で出てきたMultiStatusのオブジェクトを使って、以下のようにErrorDialog#openError を呼び出します。
MultiStatus mStatus = new MultiStatus(SamplePlugin
.getPluginId(), IStatus.OK, "マルチステータスのメッセージ",
new Exception("マルチのエラーメッセージ"));
IStatus status = new Status(IStatus.ERROR, SamplePlugin
.getPluginId(), IStatus.OK, "メッセージ1", new Exception(
"エラーメッセージ1"));
mStatus.add(status);
status = new Status(IStatus.INFO, SamplePlugin.getPluginId(),
IStatus.OK, "メッセージ2", new Exception("エラーメッセージ2"));
mStatus.add(status);
Shell shell = getSite().getWorkbenchWindow().getShell();
ErrorDialog.openError(shell, null, null, mStatus); <-ダイアログ表示処理
とすると、以下のようなエラーダイアログが表示されます。
そうすると以下のようなエラーダイアログが表示されます。
#ref(error01.png)
更にこのダイアログには詳細ボタンがあり、それをクリックすると以下の画面が表示されます。
#ref(error02.png)
メイン部分のメッセージは、MultiStatusの第3引数の文字列、詳細部分のメッセージは、
MutliStatusの例外メッセージ
|--- なかの1個目のStatusクラスの第3引数の文字列
|--- なかの1個目のStatusクラスの例外クラスのメッセージ
|--- なかの2個目のStatusクラスの第3引数の文字列
|--- なかの2個目のStatusクラスの例外クラスのメッセージ
メイン部分の「マルチステータスのメッセージ」は、MultiStatusの第3引数の文字列、詳細部分のメッセージは、
MutliStatusクラスの例外クラスのメッセージ
|--- MutliStatusのなかの1個目のStatusクラスの第3引数の文字列
|--- MutliStatusのなかの1個目のStatusクラスの例外クラスのメッセージ
|--- MutliStatusのなかの2個目のStatusクラスの第3引数の文字列
|--- MutliStatusのなかの2個目のStatusクラスの例外クラスのメッセージ
|--- ......
となります。
**タイトルの文言を変えるなど、ちょっとしたカスタマイズ [#raa96b61]
ErrorDialog.openError(shell, null, null, mStatus);
のnullの箇所に文字を設定することで、ちょっとですが表示を変更することができます。
#ref(error03.png)
また、もろもろのStatusクラスの引数のうち、例外クラスを受け取る箇所をnullにしてみると、こんな感じになります。
#ref(error04.png)
**普通のユーザ通知にも使う。 [#d178f4bb]
このやり方でやれば例外が発生していなくても、ユーザ通知に使うことができそうですね。例外を全てnullにして、MultuStatus内のStatusもERRORでなくて全てINFOとしてみます。コーディングは以下の感じですね。
MultiStatus mStatus = new MultiStatus(SamplePlugin
.getPluginId(), IStatus.OK, "マルチステータスのメッセージ", null);
IStatus status = new Status(IStatus.INFO, SamplePlugin
.getPluginId(), IStatus.OK, "メッセージ1", null);
mStatus.add(status);
status = new Status(IStatus.INFO, SamplePlugin.getPluginId(),
IStatus.OK, "メッセージ2", null);
mStatus.add(status);
Shell shell = getSite().getWorkbenchWindow().getShell();
ErrorDialog.openError(shell, "完了しました", "処理が完了しました。", mStatus);
そうするとこのようなダイアログが表示されました。
#ref(info.png)
ErrorDialogってのが気になりますが、処理が完了しました、とか普通の通知にも使えそうです。
**普通のStatusの場合も [#c0f626f4]
流れでMultiStatusを先にやりましたが、普通のStatusの場合ももちろん使えます。
IStatus status = new Status(IStatus.ERROR, SamplePlugin
.getPluginId(), IStatus.OK, "メッセージ1", new Exception(
"エラーメッセージ1"));
Shell shell = getSite().getWorkbenchWindow().getShell();
ErrorDialog.openError(shell, null, null, status);
エラー画面はこんな感じ。
#ref(errorStatus.png)
----
この記事は
#vote(おもしろかった,そうでもない)
#vote(おもしろかった[1],そうでもない[0])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}