`
hite
  • 浏览: 52404 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

异常捕获的切面--java需要优雅吗?

阅读更多
我是je的新人,大学刚毕业,入司后就一直在看别人的代码。
今天看到前人的两行注释让我思考——
……也许我所述不是问题for YOU,但是我迷茫
    public synchronized void putInCache(String cacheName, String key, Object value){
        CacheExt cache= getCache(cacheName);
//        if (cache == null) {
//            throw new NeedsRefreshException("Cache is not exist");
//        }
        cache.putInCache(key, value);
    }

为什么要注释掉呢?可能是作者认为调用它的代码过滤了cache为空的可能,例如:
   
   public synchronized boolean hasCache(String cacheName) {
        return cacheMap.getKeys().contains(cacheName);
    } 
……
    if(hasCache(cacheName)) { putInCache(……);}
……

但下面:
    public synchronized Object getFromCache(String cacheName, String key){
        CacheExt cache = getCache(cacheName);
        if(cache == null)
            return null;
        try {
            return cache.getFromCache(key);
        } catch (NeedsRefreshException e) {
            cache.cancelUpdate(key);
            return null;
        }
    }

作者又在方法内部过滤这种异常,是作者的逻辑有问题吗?
当面对外部对本方法调用有多种可能性,而每种可能性的处理又个不相同时,就出现这样的问题:
本方法不能确定外部调用是否已经过滤了异常,而自己又很迫切的需要保证这一点时,你就得在自己内部过滤掉可能的异常。但是对于许多人来说:注意防止异常的发生是基本原则(至少老师是这么教我的——),所以对于一个充分解耦的程序来说多级的调用中,或者是分组开发里,出现这样的调用A-调用->B-调用->C-调用->D-调用->E-调用->F-调用->G的调用栈,G是最终的方法即本方法,内部有过滤,同样的A-调用->B有过滤,其他一样,既
if (cache == null) {
            throw new NeedsRefreshException("Cache is not exist");
        }

出现多次,判断N次(影响效率!?)。这样我看起来很不爽,这么麻烦!一点都不简约,不朴素。
当然,也可以不处理这样就简约了,朴素了-
待续……去看奥运会开幕式——

接续:
也就是说在类的外部和内部都不处理这种异常(有这样写代码的吗?),假设程序中不会出现异常;或者捕获这种异常的代价远远大于了重启的代价——

当然,这里依然还有一种方法,也就是整个系统的通用异常处理框架或机制。如此的话,在函数方法的内部和外部(不包含最外部)不用理睬过滤的事情了……

总结:当我们不确定异常发生的时机、异常处理的种类(也许有些异常出现后,可以使用默认参数代替,有些则报错崩溃)、异常处理代价时,就出现了异常处理的切面问题,也就是说在哪里会出现异常、哪里需要处理异常、如果处理异常的问题!
   我认为有4种模式:

  • 原始社会模式——个体与个体之间社交的匮乏,可以忽略任何一个人的错误(对应不处理方式)

  • 封建社会模式——个体在不经意见的错误会有官府等机制来纠正(对应方法外部过滤)

  • 资本主义模式——当每个个体的意识和法制强度达到一定程度时,个体对外界是干净的(对应内部过滤)

  • 社会主义模式——社会主义的每个公民都是优秀的,既是偶尔犯错,也会有社会主义的政府来处理(对应统一框架或机制处理)



如果是这样的话,我想Java代码在我们面前突然就变得优雅起来。
但在日益复杂的系统里,这可能实现吗?
分享到:
评论
11 楼 fjlyxx 2008-12-10  
异常的抛出其实和你业务框架有关系。没有一定的规则。如果你的异常没有必要要上级业务知道那你完全可以处理掉这个异常,但是如果你的异常会影响上级的处理那么你就得通知它。
10 楼 hite 2008-12-10  
不是说统一处理
fjlyxx 写道

huangking 写道我也支持bloodrate兄的观点...
DAO/Service/Controller都应该有各自不同的异常抛出..

能处理则处理,不能处理则抛出,这里抛出不一定直接throw 当前捕获的异常,可以抛出自定义的异常...当然顶层需要一个统一的处理,处理那些没有被处理掉的异常

不是说统一处理,而是你要让你的调用者知道你出异常了。你可以发出一个通告给你的调用者你没有按照预定的规则进行处理。 特别是在多线程中如果你不通告回掉业务的线程业务处理出问题了那么这条线程就可能永远挂起了。

是通告不是一定要统一处理。

通知机制,是不是说还要额外的代码来实现和管理呢?那通知的内容呢,包括类型等待吗,else还有?

我还有个问题:
当外侧调用者需要知道被调用的函数具体是什么异常,但是内部的异常是通过finally抛出的模糊异常,或者是某种类型IOexception的大异常,咋办?
9 楼 fjlyxx 2008-12-08  
huangking 写道
我也支持bloodrate兄的观点...
DAO/Service/Controller都应该有各自不同的异常抛出..

能处理则处理,不能处理则抛出,这里抛出不一定直接throw 当前捕获的异常,可以抛出自定义的异常...当然顶层需要一个统一的处理,处理那些没有被处理掉的异常


不是说统一处理,而是你要让你的调用者知道你出异常了。你可以发出一个通告给你的调用者你没有按照预定的规则进行处理。 特别是在多线程中如果你不通告回掉业务的线程业务处理出问题了那么这条线程就可能永远挂起了。

是通告不是一定要统一处理。
8 楼 huangking 2008-12-08  
我也支持bloodrate兄的观点...
DAO/Service/Controller都应该有各自不同的异常抛出..

能处理则处理,不能处理则抛出,这里抛出不一定直接throw 当前捕获的异常,可以抛出自定义的异常...当然顶层需要一个统一的处理,处理那些没有被处理掉的异常
7 楼 bloodrate 2008-12-08  
我认为异常不适于在一个统一的层面统一处理,由于系统是分层结构的,每一层都有各自的异常,异常属于这个层次的实现细节之一,一个层次不应该去处理其他层次的异常,比如你在写用户管理的Controller,调用UserServices,捕捉到NoUser异常,跳转到没有用户的错误页面,捕捉到ErrPassword跳转道密码错误页面,然而你发现还要处理FileNotFoundException,一下就蒙了,这个异常该怎么恢复?这说明在写UserServices没有把FileNotFoundException隐藏好...
6 楼 hite 2008-12-08  
请注意你上面的代码的方法定义
fjlyxx 写道

这不是优雅的问题,是你对程序结构理解的问题,一个没有好的异常体系的系统不是一个优秀的系统只是我这么觉得. 异常反复抓取是异常框架和程序员的问题.请注意你上面的代码的方法定义,方法并不会抛异常所以他多判断一次多抛出一次,这个就是开发人员自身的问题了.(对于可测异常)

我也觉得和系统的框架有关系,但是有些人这么写,有些人那么写,我难以确定那种更好些。
5 楼 fjlyxx 2008-12-02  
这不是优雅的问题,是你对程序结构理解的问题,一个没有好的异常体系的系统不是一个优秀的系统只是我这么觉得. 异常反复抓取是异常框架和程序员的问题.

请注意你上面的代码的方法定义,方法并不会抛异常所以他多判断一次多抛出一次,这个就是开发人员自身的问题了.(对于可测异常)

4 楼 jyasa 2008-09-28  

sorphi 写道

请看oscache的参考文档

3 楼 hite 2008-08-12  
leobluewing 写道
可能getCache()方法被优化过了

不会返回null也不一定。

sorphi 写道
请看oscache的参考文档


其实呢,我并不是说这个代码本身有什么含义,或者讨论它的健壮性。这段代码是个因子……
所以在我的题目里没有出现cache等具体字眼。
————见接前续————
2 楼 sorphi 2008-08-12  
请看oscache的参考文档
1 楼 leobluewing 2008-08-11  
可能getCache()方法被优化过了

不会返回null也不一定。

相关推荐

    mysql-connector-java最新jar包 数据库连接驱动

    1. **spring-core-5.3.3.jar**:Spring框架的核心模块,包含IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)的基础工具,是其他Spring模块的基础。 2. **spring-beans-...

    Java Web开发异常处理方式及AOP技术

    本主题将深入探讨Java Web开发中的异常处理方式以及Aspect-Oriented Programming(面向切面编程,简称AOP)技术,这两种技术在构建健壮和可维护的应用程序中起着核心作用。 首先,让我们了解Java Web开发中的异常...

    java基于spring注解AOP的异常处理的方法

    在Java开发中,Spring框架是广泛使用的,而Spring AOP(面向切面编程)则提供了一种优雅的方式来处理全局的异常。本篇文章将深入探讨如何使用Spring注解AOP进行异常处理,特别是基于`@ControllerAdvice`的方式。 一...

    adv-java-examples.zip_adv-java-examples_大项目

    6. **异常处理**:学习如何优雅地捕获和处理程序运行时可能出现的异常,保证程序的健壮性。 7. **集合框架**:深入理解List、Set、Map等各种集合类的使用场景和优化技巧。 8. **IO流与NIO**:包括文件操作、字符流...

    pay-java-parent-develop.zip

    Java企业级应用广泛使用Spring框架,它提供了依赖注入、AOP(面向切面编程)、事务管理等功能。在“pay-java-parent-develop”中,Spring Boot可能是主要的技术栈,用于快速搭建微服务架构。 4. **微服务架构**: ...

    Java AOP 公共异常处理,一个没有try的项目。.zip

    Java AOP(面向切面编程)是Java编程领域中的一个重要概念,它允许程序员定义横切关注点,并将这些关注点与应用程序的业务逻辑分离。在实际开发中,公共异常处理是一个常见的AOP应用场景,用于统一处理可能出现的...

    java事务 - 使用动态代理

    在事务管理中,动态代理通常用于实现AOP(面向切面编程),将事务逻辑与业务逻辑分离。 1. **Java动态代理基础**: - Java动态代理基于Java反射API实现,主要涉及到`java.lang.reflect.Proxy`和`java.lang.reflect...

    Java面试八股文解析.pptx.pptx

    Spring框架提供依赖注入(IoC)和面向切面编程(AOP),简化企业级应用的开发。Hibernate作为ORM框架,消除了Java代码与数据库之间的直接耦合,提高了开发效率。 总结这些知识点,不仅有助于Java面试的准备,也是...

    java 精华贴

    - Spring作为Java企业级应用的主流框架,其依赖注入(DI)和面向切面编程(AOP)是核心概念。理解Bean管理和事务管理,可以提高开发效率。 这些知识点构成了Java开发者的必备基础,不断学习和实践将有助于提升编程...

    workshop-advance-java-02

    理解何时何地抛出异常,如何优雅地捕获和处理,是提高程序稳定性的关键。 8. **IO流**:从基本的字节流和字符流,到缓冲流、转换流,再到文件操作和对象序列化,Java IO流的掌握能让你更好地处理输入输出。 9. **...

    Java工程师不得不看的几千份代码

    这两者在插件开发、测试和AOP(面向切面编程)中有广泛应用。 8. **JVM内存管理**:理解JVM的内存模型和垃圾收集机制对于优化程序性能至关重要。代码可能会涉及内存泄漏检测、性能调优等方面,帮助开发者更好地理解...

    java 资源 笔记

    - Spring框架简化了Java EE应用的开发,提供了依赖注入、AOP(面向切面编程)和MVC等模式。 9. **测试与调试**: - JUnit是Java的单元测试框架,用于编写和执行测试用例。 - IDE(如IntelliJ IDEA、Eclipse)...

    网上书店系统 Java 源码及报告

    5. **框架技术**:可能使用了Spring MVC或Struts等框架,这些框架简化了Web应用的开发,提供了依赖注入、AOP(面向切面编程)等功能,提高了代码的可维护性和可扩展性。 6. **数据库设计**:系统中可能包括用户表、...

    Java 集成开发实例精解

    - Spring框架:提供了依赖注入、AOP(面向切面编程)和MVC(模型-视图-控制器)模式。 以上只是Java集成开发中的冰山一角,实际的学习和实践中还需要结合具体的项目需求和框架,如Spring Boot、MyBatis等,以及...

    java语言说明书

    15. **Spring框架**:作为Java应用开发中最流行的框架,Spring提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)模式等,极大地简化了Java EE应用的开发。 16. **Android开发**:Java也是Android应用...

    java图书馆系统设计

    Spring提供依赖注入(DI)和面向切面编程(AOP),简化了对象的创建和管理,同时它的MVC模块可以替代原生Servlet和JSP,提供更高级的控制流程。 六、数据持久化 图书馆系统中的数据需要持久化存储,Spring框架结合...

    Java高级程序设计实战教程-源代码.rar

    5. **异常处理**:Java的异常处理机制使得程序能优雅地处理错误情况,通过try-catch-finally语句块捕获和处理异常。 6. **集合框架**:Java集合框架包括List、Set、Map等接口及其实现,如ArrayList、HashSet、...

    达内java培训笔记

    Spring框架是Java企业级应用的常用选择,它提供了依赖注入、AOP(面向切面编程)等功能,简化了开发过程。MyBatis作为持久层框架,简化了数据库操作。 以上就是“达内java培训笔记”中可能包含的主要知识点。通过...

    java公司人事管理

    9. **异常处理**:Java的异常处理机制(try-catch-finally语句)和Spring的全局异常处理器可以帮助系统捕获并优雅地处理可能出现的错误。 10. **测试**:单元测试和集成测试是保证代码质量的关键。JUnit和Mockito等...

    JAVA开发典型模块大全.rar

    4. **异常处理**:Java异常处理允许程序在遇到错误时优雅地恢复,通过try-catch-finally语句块进行捕获和处理异常。 5. **输入输出流**:Java的I/O流系统支持读写文件、网络通信和其他数据源。理解流的概念和不同的...

Global site tag (gtag.js) - Google Analytics