互联网科技程序员Java学习笔记

【优雅编程之道】之异常的6点建议

2017-02-22  本文已影响163人  阿_毅

开心一笑

【想来想去,还是努力挣钱更靠谱,不然心情不好时,只能买两瓶啤酒医一袋鸡爪在路边嗷嗷的哭,努力挣钱的话,就能躺在幽美的山中温泉里敷面膜止住眼泪。努力挣钱我还可以去纽约哭,去伦敦哭,去巴黎哭,去罗马哭,边潇洒边哭,想怎么哭就怎么哭】

提出问题

如何优雅的写异常???

唯美图片

解决问题

禁止捕获非受检异常

至于什么是受检异常和非受检异常,我们不做讨论。这里只具体说明受检和非受检的具体事例

1)非受检的:NullPointerException,ClassCastException,ArrayIndexsOutOfBoundsException,
ArithmeticException(算术异常,除0溢出)

2)受检:Exception,FileNotFoundException,IOException,SQLException.

例:

@Test
public void test(){
    try{
        
    }catch(ArrayOutOfBoundsException e){
         
    }catch(NullPointerException e){
        
    }
}

非受检异常一般是由于程序员代码逻辑或者其他所导致的,如:NullPointerException。责任方在程序员,程序员应该去解决它,而不是交给Java编译器去处理。所以上面例子中, ArrayOutOfBoundsException 和 NullPointerException 异常都是非受检异常,不应该捕获。同时,也不应该在正常代码中处理这种异常 。

对异常进行分类处理

处理异常时,开发人员经常会通过捕获Exception异常来解决代码中抛出的所有异常。虽然无伤大雅,但却是不可取的,不利于判断导致异常的原因。

try{
        .....
//错误做法:直接用Exception揽括所有异常
}catch (Exception e){
    e.printStackTrace();
}

正确做法:

try{
     .....
}catch (FileNotFoundException e){
    logger.warn("文件找不到错误,请排查");
    e.printStackTrace();
}catch (FileAlreadyExistsException e){
    logger.warn("文件已存在错误,请排查");
    e.printStackTrace();
}

我们通过对异常进行分类处理。当异常发生时,通过logger打日志,就可以很清楚是文件找不到异常或者文件不存在异常。

避免空的catch块带来的危险

在捕获异常后,如果在catch块中,不做任何处理,是非常危险的。程序出现问题,我们又不做任何处理,控制台又不打印任何信息,故意找虐的节奏。如:

try{
    ...
}catch(SomeException e){
    //捕获异常,却不做任何处理
}

封装异常让其更受用

阅读异常有两类人:开发人员和用户。对于开发人员,查找问题时需要查看堆栈信息,而对于用户,更多的是了解具体的业务问题。如果你把堆栈里的异常信息传到前端展示给用户看,用户肯定会蒙圈。解决办法就是封装异常

例:

public class AyTest {
    @Test
    public void test(File file){
        if(file.length() > 50000){
            throw new AyBussinessException("上传文件过大,请重新上传");
        }
    }
}

class AyBussinessException extends RuntimeException{

    AyBussinessException(){}

    AyBussinessException(String msg){
        super(msg);
    }
}

通过自己封装业务异常类 AyBussinessException ,方便用户清楚异常信息,同时开发人员在以后的业务异常中都可以抛出 AyBussinessException ,统一代码,容易理解。上面只是一个简单的异常类封装,更加复杂和通用的异常类封装,有兴趣的可以自己去实现。

推荐异常和日志的配合使用

开发除了可以将异常打印到控制台中方便查看。但是一旦软件部署到生产环节中,就没有所谓的控制台,一旦生产环节出现相应的问题,就无从排查。因此,建议在catch中,多打印日志。如下:

try{
     .....
}catch (FileNotFoundException e){
    //纪录到日志文件中
    logger.warn("文件找不到错误,请排查");
    e.printStackTrace();
}catch (FileAlreadyExistsException e){
    logger.warn("文件已存在错误,请排查");
    throw new AyBussinessException("文件已存在错误,请排查");
}

这样,系统就会将错误信息记录到相关的日志文件中,方便以后排查。

切勿把异常放置在循环体内

try-catch语句本身性能不高,如果再放到循环体中,无非是雪上加霜。因此在开发中,我们要极力避免。

例:

for(int i=0;i<10;i++){
    try{
        
    }catch (Exception e){
        
    }
}

正确做法:

try{
    for(int i=0;i<10;i++){
        
    }
}catch (Exception e){

}

综上所述:不要再循环体内执行复制,耗时的操作。

读书感悟

来自《菊与刀》

经典故事

【一个小女孩趴在窗台上,看窗外的人正埋葬她心爱的小狗,不禁泪流满面,悲恸不已。她的外祖父见状,连忙引她到另一个窗口,让她欣赏他的玫瑰花园。果然小女孩的心情顿时明朗。老人托起外孙女的下巴说:“孩子,你开错了窗户。”哲理:打开失败旁边的窗户,也许你就看到了希望。】

大神文章

[1] Robert C.Martin. Clean Code: A Handbook of Agile Software [M]. Prentice Hall PTR,2008:50-69
[2] 秦小波. 编写高质量代码:改善Java程序的151个建议[M]. 北京:机械工业出版社,2012:300-301
[3] 李刚.疯狂Java讲义(第2版):电子工业出版社,2014:2
[4] 赵景晖.Java 程序设计[M]:北京机械工业出版社,2005:1-2
[5] 明日科技.Java从入门到精通(第3版)[M]:清华大学出版社,2014
[6] 李晋.Java的昨天,今天和明天[J].信息与电脑,2011(1).
[7] 任哲.JAVA技术应用基础[M]:机械工业出版社,2009:4-6
[8] 董云铮,陈千,梅惠平.Java技术应用[M]:清华大学出版社,2007:2
[9] 周志明.深入理解Java虚拟机[M]:机械工业出版社,2011:6
[10] 李明,陈京民,陶飞飞.Java程序设计与应用[M] :清华大学出版社,2010:3-4
[11] 郑悦.2006:开源精彩一年[J].中国计算机用户,2006(50).

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

上一篇下一篇

猜你喜欢

热点阅读