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

开心一笑

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

提出问题

如何优雅的写异常???

唯美图片

解决问题

禁止捕获非受检异常

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

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).

其他

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容