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