由于2.,我还必须向接口方法声明中添加“抛出”,这与需求1.冲突。
所以我的问题是,我不想在接口中有具体的实现细节,但是我想做测试驱动的开发。
我解决这个问题的第一个想法是将技术异常转换为域逻辑异常。
这是唯一的出路还是我错过了什么?是否有一个经过批准的设计模式来解决这个问题,或者解决这个问题的任何其他解决方案,因为引入许多自定义异常将导致开发中的开销。
发布于 2018-04-12 23:12:19
解决这个问题的典型方法是捕捉实现细节异常类型,并抛出一个更适合您特定服务的新异常类型。如果这就是您所说的“将技术异常转换为域逻辑异常”,那么是的,这是正确的做法。
例如,您可能有一个UserRepository接口,并且您的实现目前正在使用SQL查找用户。您可以将您的接口方法标记为抛出自己的异常类型(例如,UserNotFoundException)。您的实现捕获任何与SQL相关的错误并抛出一个UserNotFoundException。
这样,如果您将来切换到使用MongoDb或其他什么东西,您的接口将保持完全相同,而您的实现现在必须捕获MongoDb抛出的异常类型。使用您的接口的代码继续正确工作,因为它已经知道如何处理UserNotFoundException,而且没有改变。
请记住将原始异常作为您要抛出的新异常的cause,以避免丢失堆栈跟踪。
https://stackoverflow.com/questions/49806862
复制相似问题