2010-05-13 78 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); 
     } 
    }); 
} 
相關問題