我的应用程序架构大致可以这样表示:
UI --> Domain Model --> PersistenceService (Caching etc.) --> Mapping Layer
映射层包含类似DAO的接口(仅get
,insert
,update
和delete
),持久层使用这些接口并添加缓存和检查以避免不必要的更新。
理论上,映射层有各种实现,例如,可以映射到xml文件或SQL数据库;但是因为地图绘制者与“外部世界”相互作用, 它们通常会抛出已检查的异常(IOException,SomeSQLException ...)。
第一个问题是,如果每个实现的异常不同,我如何统一我的Mapper接口?我可以创建一个可以抛出的新异常(MapperException),然后通过我的持久层,通过域层“冒泡”异常,直到UI捕获它并显示(通用)错误消息。 / p>
这是我不喜欢的事情;异常是检查异常,但是没有可以实际处理它们的类或层,它们只是在它们被显示之前被传递出来并且就是这样。在几乎每个方法上都有一个throws
- 子句似乎很奇怪,只是因为一些低级别类会抛出应该处理的已检查异常。
我可以将已检查的例外转换为未经检查的例外吗?我如何确保它们仍然在用户界面中被捕获?
或者我可以以某种方式将异常处理程序注入UI层提供的较低层吗?
这有什么最佳做法吗?到目前为止,我很少处理异常,因为通常不会发生,我不关心我早期私有项目中的正确异常处理。
答案 0 :(得分:1)
我可以将已检查的例外转换为未经检查的例外吗?
是的,当然,只需将其包装在您选择的RuntimeException中:
try{
// something unsafe happens here
} catch ( SomeUglyCheckedException suce){
throw new UncheckedExceptionOfChoice("Something went wrong", suce);
}
我如何确保它们仍然在用户界面中被捕获?
可能是的,但这取决于您使用的技术。您可以在涉及的线程上注册ExceptionHandler:http://www.javapractices.com/topic/TopicAction.do?Id=229或您使用的框架可能为此提供特殊机制。
答案 1 :(得分:1)
IMO通常应该捕获低层异常,并将其包含在特定于应用程序的异常中;异常链接确保捕获根本原因。
这可以保护上层不受底层功能的影响,例如,如果你有一个通用DataLayerException
,底层的持久性机制可以随意交换,而上层不需要改变他们如何处理与持久性相关的异常。这也允许同时使用多个持久性机制,例如关系数据存储区和NoSQL数据存储区,以统一的方式向上层报告异常。
请注意,某些框架已经处理了一些此异常聚合。
转换为运行时异常可能有意义,也可能没有意义,但只要您知道它们被抛出(或可能是),就可以捕获运行时异常。这实际上取决于您的具体需求。