当存在异常时,如何使用Interfaces将接口与技术实现分开

时间:2018-04-12 22:38:36

标签: java exception-handling

(1)我尝试使用Java接口分离技术实现和域逻辑接口。

(2)由于我也做测试驱动开发,我的实现必须抛出与技术问题相关的异常。

因为(2)我必须添加'投掷'接口方法声明也是如此,它与要求(1)冲突。

所以我的问题是,我不希望在界面中有特定于实现的细节,但我想进行测试驱动开发。

我解决这个问题的第一个想法是将技术异常转换为域逻辑异常。

这是唯一可行的方法还是我错过了什么?是否有批准的设计模式来解决此问题或任何其他解决此问题的方法,因为引入大量自定义异常将导致开发开销。

1 个答案:

答案 0 :(得分:1)

解决此问题的典型方法是捕获implementation-detail Exception类型,并抛出一个更适合您特定服务的新异常类型。如果您的意思是"将技术例外转换为域逻辑异常,那么是的,这是正确的方法。

例如,您可能有一个UserRepository接口,并且您的实现当前正在使用SQL来查找用户。您可以将接口方法标记为抛出自己的异常类型(例如UserNotFoundException)。您的实现会捕获任何与SQL相关的错误,而是抛出UserNotFoundException

这样,如果您将来切换到使用MongoDb或类似的东西,您的界面将保持完全相同,而您的实现现在必须捕获MongoDb抛出的各种异常。使用您的界面的代码继续正常工作,因为它知道如何处理UserNotFoundException,并且没有改变。

请记住将原始异常作为您要抛出的新异常的cause包含在内,以免丢失堆栈跟踪。