2010-05-13 77 views
4

ErrorDialog.openError为对话标题,消息和状态(其本身具有消息)提供参数。JFace ErrorDialog:我如何在细节部分显示某些内容?

我想在主区域显示异常消息,并在详细信息区域显示调用堆栈。 然而,无论这些变化出现在主区域调用堆栈:

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

我怎样才能打开它周围?

回答

7

默认情况下,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); 
} 
1

看起来像是混合了openError中的第二个和第三个参数。第三个参数是要显示的消息。既然你给了堆栈跟踪,它就会显示出来。

一旦你得到了解决,你可能想看看使用MultiStatus。

+0

这是一条评论,不是对原始问题的回答。 – 2012-02-22 22:20:08

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); 
     } 
    }); 
} 
相关问题