有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java避免传递已检查的异常

我的应用程序架构大致可以这样表示:

UI --> Domain Model --> PersistenceService (Caching etc.) --> Mapping Layer

映射层由类似DAO的接口组成(仅getinsertupdatedelete),持久层使用这些接口并添加缓存和检查以避免不必要的更新

理论上,映射层有多种实现,例如,可以映射到xml文件或SQL数据库;但由于地图绘制者与“外部世界”互动, 它们通常抛出已检查的异常(IOException、SomeSQLException…)

第一个问题是,如果每个实现的异常不同,我如何统一映射器接口?我可以创建一个可以抛出的新异常(MapperException),然后通过持久层、域层“冒泡”异常,直到UI捕捉到它并显示(通用)错误消息

这是我不喜欢的东西;异常是选中的异常,但是没有任何类或层可以实际处理它们,它们只是向上传递,直到它们显示出来,就这样。几乎每个方法上都有一个throws-子句似乎很奇怪,因为一些低级类抛出了应该处理的已检查异常

我可以将选中的异常转换为未选中的异常吗?我如何确保它们仍然在UI中被捕获

或者我可以将异常处理程序注入到UI层提供的较低层中吗

这方面有什么最佳实践吗?到目前为止,我很少处理异常,因为异常通常不会发生,而且在我早期的私人项目中,我也不关心如何正确处理异常


共 (2) 个答案

  1. # 1 楼答案

    IMO低层异常通常应被捕获并封装在特定于应用程序的异常中;异常链接可确保捕获根本原因

    这可以保护上层不受底层功能变化的影响,例如,如果您有一个通用的DataLayerException,底层持久性机制可以随意交换,上层不需要改变它们处理持久性相关异常的方式。这还允许同时使用多个持久性机制,如关系数据库和NoSQL数据库,以统一的方式向上层报告异常

    注意,一些框架已经处理了一些异常聚合

    转换为运行时异常可能有意义,也可能没有意义,但只要知道正在抛出(或可能抛出)运行时异常,就可以捕获它们。这取决于你的具体需求

  2. # 2 楼答案

    Can I just convert the checked exceptions to unchecked exceptions?

    当然可以,只需将其包装在您选择的RuntimeException中:

    try{
        // something unsafe happens here
    } catch ( SomeUglyCheckedException suce){
       throw new UncheckedExceptionOfChoice("Something went wrong", suce);
    }
    

    How would I make sure that they are still catched in the UI?

    可能是的,但这取决于你使用的技术。您可以在涉及的线程上注册ExceptionHandler:http://www.javapractices.com/topic/TopicAction.do?Id=229,或者您使用的框架可能会为此提供一种特殊机制