异常的概念
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。
异常发生的原因有很多,通常包含以下几大类:
•用户输入了非法数据。
•要打开的文件不存在。
•网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-
在Java语言中,异常从使用方式上可以分为两大类:
在Java中类的异常结构图如下:
在异常处理时的几点建议:
1永远不要catch中吞掉异常,否则在系统发生错误时,你永远不知道到底发生了什么
catch (SomeException e) { return null; }
2尽量使用特定的异常而不是一律使用Exception这样太泛泛的异常
public void foo() throws Exception { //错误的做法}
public void foo() throws MyBusinessException1, MyBusinessException2 { //正确的做法}
一味的使用Exception,这样就违背了可检查异常的设计初衷,因为调用都不知道Exception到底是什么,也不知道该如何处理。捕获异常时,也不要捕获范围太大,例如捕获Exception,相反,只捕获你能处理的异常,应该处理的异常。即然方法的声明者在方法上声明了不同类型的可检查异常,他是希望调用者区别对待不同异常的。
3Never catch Throwable class
永远不要捕获Throwable,因为Error也是继承自它,Error是Jvm都处理不了的错误,你能处理?所以基于有些Jvm在Error时就不会让你catch住。
4正确的封装和传递异常
不要丢失异常栈,因为异常栈对于定位原始错误很关键
catch (SomeException e) { throw new MyServiceException("Some information: " + e.getMessage()); //错误的做法 }
一定要保留原始的异常:
catch (SomeException e) { throw new MyServiceException("Some information: " , e); //正确的打开方式 }
5要打印异常,就不要抛出,不要两者都做
catch (SomeException e) { LOGGER.error("Some information", e); throw e; }
这样的log没有任何意义,只会打印出一连串的error log,对于定位问题无济于事。
6不要在finally块中抛出异常
如果在finally中抛出异常,将会覆盖原始的异常,如果finally中真的可能会发生异常,那一定要处理并记录它,不要向上抛。
7不要使用printStackTrace
要给异常添加上有用的上下文信息,单纯的异常栈,没有太大意义
8Throw early catch late
异常界著名的原则,错误发生时及早抛出,然后在获得所以全部信息时再捕获处理.也可以理解为在低层次抛出的异常,在足够高的抽象层面才能更好的理解异常,然后捕获处理。
9对于使用一些重量级资源的操作,发生异常时,一定记得清理
如网络连接,数据库操作等,可以用try finally来做clean up的工作。
10不要使用异常来控制程序逻辑流程
我们总是不经意间这么做了,这样使得代码变更丑陋,使得正常业务逻辑和错误处理混淆不清;而且也可能会带来性能问题,因为异常是个比较重的操作。
11及早校验用户的输入
在最边缘的入口校验用户的输入,这样使得我们不用再更底层逻辑中处处校验参数的合法性,能大大简化业务逻辑中不必要的异常处理逻辑;相反,在业务中不如果担心参数的合法性,则应该使用卫语句抛出运行时异常,一步步把对参数错误的处理推到系统的边缘,保持系统内部的清洁。
12在打印错误的log中尽量在一行中包含尽可能多的上下文
LOGGER.debug("enter A"); LOGGER.debug("enter B"); //错误的方式
LOGGER.debug("enter A, enter B");//正确的方式
Thanks all. Happy Learning!!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。
程序读文件内容的过程可能会发生错误,例如:要读取的文件不存在。传统的错误处理方式如下: 某个函数 f 在运行过程中可能会发生错误; 函数 f 发生错误时,函数 f 返回错误代码; 在调用函数 f 的地方,需要检查 f 的返回值是否有错。 1. 传统的错误处理方式 1.1 返回错误码 例如,在 C 语言中,函数 open 用于打开一个文件,它的声明如下: int open(char *path, i
本文向大家介绍总结十条.NET异常处理建议,包括了总结十条.NET异常处理建议的使用技巧和注意事项,需要的朋友参考一下 .NET中从始至终要紧记异常处理的策略:抛出具体的一个异常,而不是只抛出Exception类型的异常,这样能方便我们捕获对应类型的异常。我们在编写代码时要注意考虑到应用程序最差的情况;显示有好的信息,并提供适当的管理员联系信息。 1、不要抛出“new Exception()” 请
本文向大家介绍python 异常处理总结,包括了python 异常处理总结的使用技巧和注意事项,需要的朋友参考一下 最近,做个小项目经常会遇到Python 的异常,让人非常头疼,故对异常进行整理,避免下次遇到异常不知所措,以下就是对Python 异常进行的整理。 1.Python异常类 异常 描述 NameError 尝试访问一个没有申明的变量 ZeroDivisionErro
条件处理 if 这个special form跟java里面的if的语义是一样的, 它接受三个参数, 第一个是需要判断的条件,第二个表达式是条件成立的时候要执行的表达式,第三个参数是可选的,在条件不成立的时候执行。如果需要执行多个表达式,那么把多个表达式包在do里面。看例子: (import '(java.util Calendar GregorianCalendar)) (let [gc (Gre
主要内容:异常简介,异常类型很多事件并非总是按照人们自己设计意愿顺利发展的,经常出现这样那样的异常情况。例如: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回家。但天有不测风云,当你准备烧烤时候突然天降大雨,只能终止郊游提前回家。“天降大雨”是一种异常情况,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。 计算机程序的编写也需要考虑处理这些异常情况。 异常(exception)是在运行程序时产生的一种异
我期望第1行捕获从第0行抛出的NullPointerException,但它没有发生。 但为什么呢?。 当定义了另一个catch块时,为什么第1行的NPE处理程序不能捕获它? 是因为“投掷”直接进入main()方法吗?