(1)我尝试使用Java接口分离技术实现和域逻辑接口。
(2)由于我也做测试驱动开发,我的实现必须抛出与技术问题相关的异常。
因为(2)我必须添加'投掷'接口方法声明也是如此,它与要求(1)冲突。
所以我的问题是,我不希望在界面中有特定于实现的细节,但我想进行测试驱动开发。
我解决这个问题的第一个想法是将技术异常转换为域逻辑异常。
这是唯一可行的方法还是我错过了什么?是否有批准的设计模式来解决此问题或任何其他解决此问题的方法,因为引入大量自定义异常将导致开发开销。
答案 0 :(得分:1)
解决此问题的典型方法是捕获implementation-detail Exception类型,并抛出一个更适合您特定服务的新异常类型。如果您的意思是"将技术例外转换为域逻辑异常,那么是的,这是正确的方法。
例如,您可能有一个UserRepository接口,并且您的实现当前正在使用SQL来查找用户。您可以将接口方法标记为抛出自己的异常类型(例如UserNotFoundException
)。您的实现会捕获任何与SQL相关的错误,而是抛出UserNotFoundException
。
这样,如果您将来切换到使用MongoDb或类似的东西,您的界面将保持完全相同,而您的实现现在必须捕获MongoDb抛出的各种异常。使用您的界面的代码继续正常工作,因为它知道如何处理UserNotFoundException
,并且没有改变。
请记住将原始异常作为您要抛出的新异常的cause
包含在内,以免丢失堆栈跟踪。