【问题标题】:How to handle fail situation into a simple Java application?如何在一个简单的 Java 应用程序中处理失败情况?
【发布时间】:2015-02-26 22:31:08
【问题描述】:

我是一名 Java 开发人员,但我在软件架构方面还没有很多经验。

我有以下情况。我正在创建一个批处理应用程序(一个运行到 shell 中的命令行应用程序),因此它是从定义到 Main() 类中的 ma​​in() 方法开始的。

在这个 ma​​in() 方法中,我创建了其他类的一些对象实例,这些对象执行某些操作(例如在 DB 上执行查询、创建 PDF 等),因此应用程序可能会失败。

如果应用程序没有失败(一切都按预期进行),ma​​in() 方法以 exit code = 0 结束。

我希望如果应用程序失败(在任何时候)返回的退出代码是 -1

所以现在我不知道该如何处理这种情况。

例如,如果进入 ma​​in() 方法我有这样的东西:

// Create DAO object:
FatturaDAO fatturaDAO = new FatturaDAO(conn);
listaFatture = fatturaDAO.getListaFatturePDF(partitaIVA);

我在其中创建和使用 DAO 对象。现在考虑 FatturaDAO 对象出现故障(例如连接丢失并引发异常)的情况。

如何正确处理这种情况?

我有 2 个想法,但我不知道什么是最好的解决方案:

  1. 我在我的代码中放置了一些 try catch 块,因此如果出现故障,它会进入处理它的 catch 块执行:

    System.exit(-1);
    
  2. 如果发生故障,它会进入 catch 块,而不是退出会抛出一个自定义异常,该异常会返回到执行的 ma​​in() 方法:

    System.exit(-1);
    

或者我可以用其他更聪明的方式处理这些情况吗?

【问题讨论】:

标签: java jakarta-ee exception architecture exception-handling


【解决方案1】:
2. If something fail it enter into the catch block that instead of exit 
throws  a custom exception that goes back until the main() method that perform:

如果您在main() 中处理异常,那么您必须在父级有错误处理代码。如果有任何变化不需要检查其他函数,只需在其他函数上添加through关键字并处理main()中的异常并返回所需的类型即可。

在大多数 J2EE 应用程序中,我们在 Controller 部分而不是 DAOService 层中处理异常。发生异常时更容易将消息传递给用户。

【讨论】:

    【解决方案2】:

    在命令行应用程序中,main() 方法实际上是 UI 层。这是一个非常简单的 UI,但是,如果您构建应用程序以便主类调用控制器层,并且控制器层抛出异常,您应该在 main() 方法中捕获该异常并返回正确的“用户价值”为 0 或 -1。

    【讨论】:

    • 我可以执行 System.exit(-1) 有什么问题;在 main() 中创建的另一个对象内?
    • 不要,在另一个对象内部抛出异常,在 main 中捕获它,并仅在 main 中呈现“UI”。
    • 好的,但是动机是什么?
    • 动机是将 UI 关注点与业务逻辑关注点分开。假设您将此批处理从命令行过程中分离出来,并将其连接到队列或数据库。 System.exit() 不适用于这些场景,它们有不同的接口(记录错误,或在数据库中插入错误行等)。
    • Tnx 为您澄清 :-)
    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2016-01-01
    • 1970-01-01
    • 2020-10-04
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多