我是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代码在我们面前突然就变得优雅起来。
但在日益复杂的系统里,这可能实现吗?
分享到:
相关推荐
Spring中,使用切面全局捕获异常的同时,进行自定义异常抛出捕获,方便代码书写。
用Exception类捕获所有异常---马克-to-win java视频的介绍
本资源文件是利用SpringMVC面向切面实现的一套捕获全局异常插入数据库的代码,刚开始想实现HandlerExceptionResolver,但是不知道为什么不起作用,又自己重新写了一套。
主线程如何捕获子线程的异常---马克-to-win java视频的介绍
一个线程捕获另外一个线程的异常1---马克-to-win java视频
20.java多异常捕获.zip20.java多异常捕获.zip20.java多异常捕获.zip20.java多异常捕获.zip20.java多异常捕获.zip20.java多异常捕获.zip20.java多异常捕获.zip20.java多异常捕获.zip20.java多异常捕获.zip20.java多...
多重捕获MultiCatch1---马克-to-win java视频的详细描述
重捕获MultiCatch2---马克-to-win java视频的详细介绍
一个线程捕获另外一个线程的异常2---马克-to-win java视频
自己编写异常类型 ,自定义错误异常进行全局捕捉。实现项目全局的拦截定义输出。。。
android在产品上线以后为了能够实时捕获异常,需要写一个异常捕获的类,这个类在你遇到异常的时候会执行uncaughtException这个方法,然后你就可以对异常进行一些操作。
Java异常架构与异常关键字 Java异常简介 Java异常架构 1. Throwable 2. Error(错误) 3. Exception(异常) 运行时异常 编译时异常 4. 受检异常与非受检异常 受检异常 非受检异常 Java异常关键字 Java异常处理 声明...
java try…catch捕获异常的实例 java try…catch捕获异常的实例
java try…catch嵌套捕获异常的实例 java try…catch嵌套捕获异常的实例
java所有能捕获的异常大全说明,详细的说明及场景!java所有能捕获的异常大全说明,详细的说明及场景!
支持易语言程序代码自设SEH捕获异常
mldn中李新华老师关于Java异常的捕获及处理的课堂记录
try-catch-finally捕获异常try-catch-finally捕获异常
java try…catch…finally捕获异常的实例 java try…catch…finally捕获异常的实例
ASP.NET最佳异常处理:try-catch语句捕获异常 ASP.NET最佳异常处理:try-catch语句捕获异常