JFace ErrorDialog: как мне показать что-то в части деталей? - PullRequest
5 голосов
/ 13 мая 2010

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 ]

8 голосов
/ 23 февраля 2012

В 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);
}
3 голосов
/ 31 октября 2013

Вы можете обернуть исключение новым, содержащим трассировку стека как сообщение.

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);
        }
    });
}
1 голос
/ 06 ноября 2010

Похоже, вы перепутали 2-й и 3-й параметры в openError. Третий параметр - это сообщение, которое будет показано. Поскольку вы даете трассировку стека, она показывает это.

Как только вы это исправите, вы можете захотеть использовать MultiStatus.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...