大多数编程语言没有检查异常(如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替换的已检查异常,但没有关于最佳替代方案的结论。我仍然同意那里的评论:
我正在阅读上述讨论,我仍然不知道异常是否有用。
因此,在类似情况下,如何使用不支持已检查异常的语言解决此问题?
答案 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)
对于您列出的例外类型:
您可以编写一个验证方法来验证输入并返回验证数据值对象。此验证方法和数据值对象将随着应用程序的发展而发展,并且验证的复杂性将封装在此方法中,并且可能存在于其自己的类中(并且可能会调用其他类来执行其他特定任务)。
然后,您可以执行多种选项之一。
您可以创建一个Exception类ValidationException,它将验证数据值对象作为实例变量。在原始方法的开头调用验证方法,创建并抛出验证异常类的实例,并将验证数据值对象作为实例变量。
您可以在调用原始方法之前调用验证方法,如果验证失败则不调用原始方法。
两者。