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);
}
如何切换它?
答案 0 :(得分:8)
在默认的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 :(得分:3)
您可以使用包含stacktrace作为消息的new来包装异常。
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);
}
});
}
答案 2 :(得分:1)
看起来你正在混淆openError上的第二个和第三个参数。第3个参数是要显示的消息。因为你给它堆栈跟踪它显示它。
一旦解决了问题,您可能需要考虑使用MultiStatus。