JFace ErrorDialog:如何在细节部分显示内容?

Ale*_*nov 5 java jface

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);
}
Run Code Online (Sandbox Code Playgroud)

我该如何切换它?

Lib*_*nek 9

在默认的JFace ErrorDialog中,只显示完整异常堆栈跟踪的方法(与printStackTrace()生成的相同)是将堆栈跟踪的每一行构建为一个状态.最后将这些状态设置为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);
}
Run Code Online (Sandbox Code Playgroud)