如何在服务编排方案中处理没有检查异常的错误?

时间:2017-06-16 19:36:57

标签: java exception error-handling exception-handling

大多数编程语言没有检查异常(如C#和Kotlin)。

所以,我正在尝试为我的项目中的案例找到一个更好的方法,而不使用已检查的异常。

该项目使用Java,我们控制远程EJB可能存在的验证错误。像这样:

query builder

此方法会抛出许多验证异常,例如:

lookupSomeRemoteEjb().createCustomer(/** lots of informations */);

等等。

此异常可能发生在不同级别的不同类中。像这个例子:

DocumentoAlreadyExistsException();
InvalidNameException();
InvalidBirthDateException();

API调用此远程EJB并捕获每个错误,将此消息转换为API用户(使用此远程EJB)的好消息。

运行良好,但每次调用时代码都很乱,很多丑陋的try / catch。

我认为替代方法是使用带有ID错误的未经检查的异常,或使用类似ID的CustomerRemoteEjb.class // tell to the another system what error happened CustomerService.class //can throw some errors about customer PersonService.class // can throw some errors about person DocumentService.class // can throw some errors about document AddressService.class // can throw some errors about address 对象来验证错误。

但是这种解决方案并不适合更复杂的代码(顺便说一下,单元系统),因为很多时候这些验证是由另一个服务调用的服务完成的。奇怪的是,这个深度服务在到达API之前将异常(或结果对象)返回到另一个服务的ID。

我读了一些old discussion about替换的已检查异常,但没有关于最佳替代方案的结论。我仍然同意那里的评论:

  

我正在阅读上述讨论,我仍然不知道异常是否有用。

因此,在类似情况下,如何使用不支持已检查异常的语言解决此问题?

3 个答案:

答案 0 :(得分:1)

使用不同的已检查异常有一个基本问题:它引入了版本兼容性问题。如果双方可以有不同的代码级别,你必须担心ejb方面使用"更新"例外......

您的问题提供了一个可能的解决方案(通过使用一些返回对象)。但还有另一种选择:你可以选择一个例外,而不是拥有数以万计的不同例外。并且该异常带有某种错误ID。

含义:用户错误消息不是从异常类型派生的,而是来自某些数字ID,例如。当然,这种方法还有其它方面的缺点 - 但它仍然可以解决(一些)在使用"每个问题一个异常类时遇到的问题"做法。

答案 1 :(得分:1)

对于已检查的例外,您只能使用一个通用 SystemException 。这将解决“捕捉多个异常”问题。

但是 SystemException 需要有关于诸如errorCodes之类的异常的信息和/或用于集成的消息(如Remote EJB)使用它们。

对于旧版代码,我建议:

  • 将所有 LegacySpecificException 扩展 SystemException (或)

  • 将所有 LegacySpecificException 转换为 SystemException

另一个问题:如果你需要“尝试捕获”另一个异常而不是 SystemException (例如 EJBException ),你需要处理它并重新抛出一个的 SystemException的

} catch (EJBException e) {
  throw new SystemException(e.getMessage(), e);
}

* ref:https://northconcepts.com/blog/2013/01/18/6-tips-to-improve-your-exception-handling/

答案 2 :(得分:0)

对于您列出的例外类型:

  • DocumentoAlreadyExistsException();
  • InvalidNameException();
  • InvalidBirthDateException();

您可以编写一个验证方法来验证输入并返回验证数据值对象。此验证方法和数据值对象将随着应用程序的发展而发展,并且验证的复杂性将封装在此方法中,并且可能存在于其自己的类中(并且可能会调用其他类来执行其他特定任务)。

然后,您可以执行多种选项之一。

您可以创建一个Exception类ValidationException,它将验证数据值对象作为实例变量。在原始方法的开头调用验证方法,创建并抛出验证异常类的实例,并将验证数据值对象作为实例变量。

您可以在调用原始方法之前调用验证方法,如果验证失败则不调用原始方法。

两者。