【问题标题】:Exception Handling in a gui applicationgui 应用程序中的异常处理
【发布时间】:2012-10-12 16:12:48
【问题描述】:

我对如何在我的 GUI 应用程序中处理未经检查的异常有点迷茫。

例如具有将用户新创建的公司保存在(嵌入式)数据库中的功能。

保存新建公司的函数抛出3个异常:

IllegalArgumentException:如果公司或非空字段为空(手动检查并抛出)。

EntityExistException: 如果公司(它的名字)已经存在。 (也是手动检查并抛出)。

PersistenceException: 如果尝试保存时出现问题。 (捕获并重新抛出)。

调用saveCompany 方法的函数捕获所有 3 个异常,然后记录它们并向用户显示发生错误的对话框。

我现在想知道我是否需要抓住它们?或者让他们跑到globalExceptionHandler(我也可以在哪里看他们)可以吗? 我也想知道我的反应应该是什么?

我应该告诉用户有一个错误并让程序运行(因为程序的其他部分应该正常运行)还是应该告诉他然后结束程序(因为这是一个不应该出现的程序员错误在那里)?

【问题讨论】:

    标签: java user-interface exception-handling unchecked


    【解决方案1】:

    如果发生 IllegalArgumentException,您应该捕获异常并告诉用户更正数据(不要打印堆栈跟踪)。

    如果发生 EntityExistException,应通知用户该公司已经存在,或许他或她应该考虑对其进行更新。

    当用户收到 PersistenceException 时,他们应该看到一个包含堆栈跟踪(可能还有其他与开发人员相关的数据)的对话框窗口,并被告知提交错误报告。

    【讨论】:

    • 我实际上不会向用户显示堆栈跟踪,我会考虑任何匿名化和/或安全传输,但是是的,这是合理的。
    • 我可以让我无法直接处理的异常(如 PersistenceException)运行到 globalExceptionHandler 还是应该像其他 2 一样在调用函数中捕获它们?问原因我有许多函数调用可以引发这种期望的函数。所以我想知道我是否可以节省一些代码行(代码看起来也更干净,catch 块更少)。
    • @LuGo 认为客户看到这样的对话会感到满意。
    • @Maja - 是的,尽可能晚地捕获它们,在你的情况下,在 globalExceptionHanlder 中。多亏了这一点,您的代码不会膨胀。
    【解决方案2】:

    所以好消息是你问了所有正确的问题。

    我应该告诉用户出现错误并让程序运行(因为程序的其他部分应该正常运行)还是应该告诉他然后结束程序(因为这是不应该出现的程序员错误在那里)?

    这是一个你需要仔细考虑的设计问题。如果这是一个可恢复的错误并且程序无法继续运行,那么程序应该在用户没有选择的情况下关闭。如果程序的一部分必须终止,但其他部分可能会终止,则应通知用户。如果用户需要修复一些数据以便程序可以运行,则应通知用户。等等。是的,尽管您提出了正确的问题,但您实际上必须考虑它们并保持审慎。

    【讨论】:

      【解决方案3】:

      在我看来,请执行以下操作

      EntityExistException :让用户知道实体已经存在。继续使用该应用。

      PersistenceExceptionIllegalArgumentException :给用户一个通用消息,然后停止应用程序。

      我希望您能看到上述两个异常处理方式的不同之处。一种是可以由用户引起和修复的东西。另一个是用户无能为力的事情。

      【讨论】:

      • 那么我应该在调用函数中捕获 PersistenceException 和 IllegalArgumentException 还是应该/可以让 GlobalExceptionHandler 处理它?
      • 这取决于几件事 1:如果您的代码的任何其他部分抛出 PersistenceException 和 IllegalArgumentException。 2:你想以同样的方式处理所有这些吗? 3.或者您是否想以更本地化的方式为 saveCompany 处理这些异常,然后可能会抛出一个新的异常,其中包含更具描述性的消息供 GlobalExceptionHandler 处理。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多