Как обработать исключение Java в удобной для пользователя форме - PullRequest
7 голосов
/ 12 октября 2010

Я занимаюсь разработкой Swing-приложения, и я немного сбит с толку, как я могу обрабатывать исключения, например, в последнее время часть файлов с кодами переименования, поэтому, когда я тестировал его, у меня возникло «у вас нет разрешение на переименование файла ", как я получил его из сообщения об исключении печати. Так как я могу выразить это сообщение пользователю? и я должен использовать сообщение JOptionPane или просто показать его в строке состояния?

Спасибо

Ответы [ 7 ]

8 голосов
/ 12 октября 2010

Судя по вашему вопросу, вы уже знаете, как обрабатывать исключения в смысле Java. Однако вы ищете советы о том, как реагировать на исключения, как только вы их поймали.

В конкретном примере, который вы приводите в своем вопросе, я (как пользователь) хотел бы, чтобы эта ошибка была представлена ​​достаточно четко, поэтому JOptionPane может быть вашим лучшим выбором. Я бы не стал обновлять строку состояния, так как она очень близка к молчаливому сбою, а пользователь просто растерялся.

Личное эмпирическое правило заключается в том, что если пользователю, вероятно, придется дождаться завершения кода, прежде чем приступить к выполнению своей задачи, то он должен быть строго проинформирован о сбое, то есть модальном окне. Если сбой является фоновой задачей, которую пользователь может выполнить, не заботясь о ней, или код может восстановиться после нее, или код будет повторяться, то я бы пошел с более тонким подходом изменения строки состояния или значка. в зависимости от пользовательского интерфейса.

2 голосов
/ 12 октября 2010

Чтобы уточнить комментарий Кевина Д. - это действительно зависит от вашей ожидаемой пользовательской аудитории.Если они технически опытны, вы можете использовать текст исключения как есть.Если нет, то я бы добавил префикс к сообщению «Произошла ошибка, обратитесь к сотрудникам службы технической поддержки со следующей информацией:», затем добавьте сообщение об ошибке и в идеале уникальный идентификатор для поиска связанной записи журнала ... Я часто используювременная метка для этого.

Если вы действительно хотите проявить фантазию, вы можете отправить сотрудникам службы технической поддержки гораздо более подробную информацию, например, об исключениях и полной трассировке стека, копии записи журнала и т. д. Я делал это в прошломно вы должны быть осторожны, так как часто возникающая ошибка быстро заполняет почтовый ящик:)

Конечно, если ошибка может быть исправлена ​​пользователем, вы можете просто сказать об этом (и как это сделать) в вашемсообщение.Это настолько тщательно и причудливо, насколько это возможно ...

1 голос
/ 12 октября 2010

Если вы ожидаете, что исключение может произойти в результате действия пользователя, то вам следует явно отловить его в том месте, где это имеет смысл, и обеспечить правильное восстановление вашей программы.

Например, если пользователь может переименовать файл, вы можете вызвать метод rename (), который возвращает код состояния, указывающий на успех или код ошибки.Внутри метода один из этих кодов может фактически вызываться исключением, но вызывающему коду это не важно.Как только вызов возвращается, код состояния может использоваться для определения того, какое сообщение об ошибке показывать (если оно есть).

  enum RenameStatus {
    Success,
    Failed,
    SecurityFailed
  }

  void doRename(File fromFile, File toFile) {
     switch (rename(fromFile, toFile)) {
     case Success:
       break;
     case Failed:
       // todo generic dialog rename operation failed
       break;
     case SecurityFailed:
       // todo security dialog rename operation failed due to permission
       break;
     }
  }

  RenameStatus rename(File fromFile, File toFile) {
    try {
      if (!fromFile.renameTo(toFile)) {
        return RenameStatus.Failed;
      }
      return RenameStatus.Success;
    }
    catch (SecurityException e) {
      // Error - permission error
      return RenameStatus.SecurityFailed;
    }
    catch (Exception e) {
      return RenameStatus.Failed;
    }
  }
1 голос
/ 12 октября 2010

Я не совсем понимаю первую часть вашего вопроса, но я пытаюсь ответить на вторую. В целом, способ отображения ошибки для пользователя зависит от программного обеспечения и ошибки. В большинстве случаев JOptionPane или аналогичный подходит. Тем не менее, в некоторых случаях модальное диалоговое окно может быть слишком навязчивым, и строка состояния может быть лучшим способом. Но опять же, это зависит от того, какое программное обеспечение вы пишете.

0 голосов
/ 12 октября 2010

Разрешение для файла является своего рода «нормальным» исключением, а не действительно «исключительным», как «полный диск», поэтому вы, вероятно, просто используете JOptionPane вместо отправки отчета об ошибке. При этом некоторые более ранние ответы очень информативны и должны быть приняты для общих случаев.

Кроме того, мои main() всегда начинаются с этого:

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler()
{
     public void uncaughtException(Thread t, Throwable e)
     {
         // do your things: see earlier answers
     }
}
0 голосов
/ 12 октября 2010

Если вы поймаете выражение (заключенное в блок try - catch -), вы получите уведомление, когда возникнет это исключение. Тогда вы должны решить: есть ли способ заставить вещи работать снова? Не могли бы вы, например, спросить у пользователя другое имя файла? Тогда сделай это! Но если нет разумного способа обойти ошибку, просто прервите программу.

0 голосов
/ 12 октября 2010

Использовать обработку Try-Catch ...

http://tutorials.jenkov.com/java-exception-handling/basic-try-catch-finally.html

Когда вы ловите исключение, вы можете делать с ним все, что захотите. Отобразите это пользователю, сделайте что-нибудь еще в коде, отобразите другое сообщение пользователю на основе исключения и т. Д.

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