开心一笑
【想来想去,还是努力挣钱更靠谱,不然心情不好时,只能买两瓶啤酒医一袋鸡爪在路边嗷嗷的哭,努力挣钱的话,就能躺在幽美的山中温泉里敷面膜止住眼泪。努力挣钱我还可以去纽约哭,去伦敦哭,去巴黎哭,去罗马哭,边潇洒边哭,想怎么哭就怎么哭】
提出问题
如何优雅的写异常???
解决问题
禁止捕获非受检异常
至于什么是受检异常和非受检异常,我们不做讨论。这里只具体说明受检和非受检的具体事例
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).
其他
如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!