如何以用户友好的方式处理java异常

时间:2010-10-12 12:27:28

标签: java swing exception exception-handling

我正在开发一个swing应用程序,我有点困惑,我怎么能处理异常,例如最近我的代码重命名文件的一部分,所以当我测试它时,我想出了一个“你没有重命名文件的权限“因为我从打印异常消息中获取它。那么我该如何向用户表达此消息?我应该使用JOptionPane消息还是只在状态栏上显示它?

由于

7 个答案:

答案 0 :(得分:8)

从您的问题来看,听起来您已经知道如何处理java意义上的异常。但是,您正在寻找有关如何在捕获异常后对异常作出反应的建议。

在您提出问题的具体示例中,我(作为用户)希望错误地呈现错误,因此JOptionPane可能是您最好的选择。我不会只是更新状态栏,因为它非常接近于默默地失败,用户只会感到困惑。

个人经验法则是,如果用户在继续执行任务之前有可能等待代码完成,则必须强烈地通知他们失败,即模态框。如果失败是在后台任务中,用户可以继续进行而无需关心,或者代码可以从中恢复,或者代码将重试,那么我会采用状态栏或图标更改的更微妙的方法取决于用户界面。

答案 1 :(得分:2)

详细说明Kevin D的评论 - 这实际上取决于您的预期用户受众。如果技术熟练,您可以按原样使用异常文本。如果没有,那么我将在消息前面加上“发生错误,请联系您的技术支持人员并提供以下信息:”然后附加错误消息,理想情况下是用于查找关联日志条目的唯一标识符...我经常使用时间戳为此。

如果您真的想要获得幻想,您可以向技术支持人员发送更多详细信息,例如异常和完整堆栈跟踪,日志条目副本等。我过去已经这样做了但是你必须要小心经常发生的错误会迅速淹没收件箱:)

当然,如果用户可以修复错误,那么您可以在邮件中说明(以及如何操作)。这就像你可以得到的那样彻底和花哨......

答案 2 :(得分:1)

我不太明白你问题的第一部分,但我试着回答第二部分。通常,您希望如何向用户显示错误取决于软件和错误。在大多数情况下JOptionPane或类似情况是合适的。但是,在某些情况下,模态对话框可能过于干扰,状态栏可能是更好的方法。但同样,这取决于你正在编写什么样的软件。

答案 3 :(得分:1)

如果您预计由于用户操作可能会发生异常,那么您应该在有意义的位置明确捕获它并确保程序正确恢复。

例如,如果用户可以重命名文件,则可以调用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;
    }
  }

答案 4 :(得分:0)

如果您捕获表达式(包含在try-catch-block中),则会在发生此异常时收到通知。然后你必须决定:有没有办法让事情再次发挥作用?例如,您可以向用户询问另一个文件名吗?然后那样做!但如果没有合理的方法来规避错误,那么只需让程序中止。

答案 5 :(得分:0)

文件权限是一种“正常”异常,而不是“磁盘已满”的真正“特殊”异常,因此您可能只使用JOptionPane而不是发送错误报告。话虽如此,一些早期的答案非常有用,应该针对一般情况采用。

此外,我的main()始终以此开头:

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler()
{
     public void uncaughtException(Thread t, Throwable e)
     {
         // do your things: see earlier answers
     }
}

答案 6 :(得分:-1)

使用Try-Catch处理......

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

当你发现异常时,你可以随心所欲地做任何事情。将其显示给用户,在代码中执行其他操作,根据异常向用户显示另一条消息等。