美文网首页互联网科技程序员Java学习笔记
【优雅编程之道】之异常的6点建议

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

作者: 阿_毅 | 来源:发表于2017-02-22 07:21 被阅读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).

    其他

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

    相关文章

      网友评论

        本文标题:【优雅编程之道】之异常的6点建议

        本文链接:https://www.haomeiwen.com/subject/laypwttx.html