5

ErrorDialog.openErrorダイアログのタイトル、メッセージ、およびステータス(メッセージ自体が含まれる)の引数を取ります。

メインエリアに例外のメッセージを表示し、詳細エリアにコールスタックを表示したいと思います。ただし、これらのバリエーションは両方とも、メイン領域のコールスタックを示しています。

void showException(Throwable e) {
    Status status = 
        new Status(IStatus.ERROR, "SCS Admin", e.getLocalizedMessage(), e);
    e.printStackTrace;
    ErrorDialog.openError(getShell(), null, Util.getStackTrace(e), status);
}

void showException(Throwable e) {
    Status status = 
        new Status(IStatus.ERROR, "SCS Admin", Util.getStackTrace(e), e);
    e.printStackTrace;
    ErrorDialog.openError(getShell(), null, e.getLocalizedMessage(), status);
}

どうすれば切り替えることができますか?

4

3 に答える 3

9

デフォルトのJFaceErrorDialogでは、完全な例外スタックトレース(printStackTrace()によって生成されるものと同じ)を表示する唯一の方法は、スタックトレースの各行を1つのステータスとして構築することです。そして最後に、これらのステータスをMultiStatusの子として設定します。

RCPアプリで使用するユーティリティメソッドの例を次に示します。

/**
 * Shows JFace ErrorDialog but improved by constructing full stack trace in
 * detail area.
 */
public static void errorDialogWithStackTrace(String msg, Throwable t) {

    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    t.printStackTrace(pw);

    final String trace = sw.toString(); // stack trace as a string

    // Temp holder of child statuses
    List<Status> childStatuses = new ArrayList<>();

    // Split output by OS-independend new-line
    for (String line : trace.split(System.getProperty("line.separator"))) {
        // build & add status
        childStatuses.add(new Status(IStatus.ERROR, Activator.PLUGIN_ID, line));
    }

    MultiStatus ms = new MultiStatus(Activator.PLUGIN_ID, IStatus.ERROR,
            childStatuses.toArray(new Status[] {}), // convert to array of statuses
            t.getLocalizedMessage(), t);

    ErrorDialog.openError(null, PxConstants.DIALOG_TITLE, msg, ms);
}
于 2012-02-22T22:23:13.027 に答える
3

スタックトレースをメッセージとして含む新しいもので例外をラップすることができます。

public void showException(final Exception ex) {
    Display.getDefault().syncExec(new Runnable() {
        @Override
        public void run() {
            StringWriter sw = new StringWriter();
            ex.printStackTrace(new PrintWriter(sw));
            IStatus status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, ex.getMessage(), new Exception(sw.toString()));
            ErrorDialog.openError(Display.getDefault().getActiveShell(), "Error", null, status);
        }
    });
}
于 2013-10-31T09:55:19.453 に答える
1

openErrorの2番目と3番目のパラメータを混同しているようです。3番目のパラメーターは、表示されるメッセージです。スタックトレースを指定しているので、それが表示されます。

それを修正したら、MultiStatusの使用を検討することをお勧めします。

于 2010-11-05T21:09:38.663 に答える