代码之家  ›  专栏  ›  技术社区  ›  Alexey Romanov

jface errordialog:我如何在细节部分显示某些内容?

  •  5
  • Alexey Romanov  · 技术社区  · 15 年前

    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);
    }
    

    我该怎么换呢?

    3 回复  |  直到 12 年前
        1
  •  8
  •   Matt Warrick    14 年前

    在默认情况下,显示完整异常堆栈跟踪(与printstacktrace()生成的跟踪相同)的唯一方法是将堆栈跟踪的每一行构建为一个状态。最后将这些状态设置为多状态的子状态。

    下面是我在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);
    }
    
        2
  •  3
  •   Niklaus Bucher    12 年前

    您可以使用包含stacktrace作为消息的新的来包装异常。

    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);
            }
        });
    }
    
        3
  •  1
  •   jameskpolk    15 年前

    看起来您正在混淆openerror上的第2个和第3个参数。第三个参数是要显示的消息。既然你给了stacktrace,它就会显示出来。

    一旦你修好了,你可能会想用一个多状态。