##友好的异常处理
程序使用 try…catch 进行整段代码的包括,输出了相应的错误日志,如果不是最外层调用则 catch 里不打印堆栈信息,并且 throws 了自定义异常,同时把堆栈信息带出去,最外层调用方,根据自定义异常,选择友好的提示信息给用户展示,并且打印出异常的堆栈信息。即程序根据实际情况对异常进行了综合处理,并通过日志进行了异常的详细记录,以便核查问题。
##异常处理有哪些原则
三大原则
程序层面异常处理原则
- 避免异常处理代替错误处理;
有的人写代码会用异常处理来做判断逻辑或者做业务逻辑处理,这样会降低程序的清晰性,并且效率低下。 - 处理异常不可以代替简单测试,只能在异常情况下使用异常机制;
- 不要进行小粒度的异常处理,应该将整个业务代码包装在一个try语句块中;
- 异常往往在高层处理,且不能忽视任何一个异常;
需求层面异常处理原则
- 程序员不定义业务异常流程
业务需求是通过代码来实现的,程序员一般不了解业务,因此在写某个业务需求过程中,发现处理不了的异常,一定要与客户或者产品负责人来确定异常流程,从业务逻辑层面,考虑异常处理的业务逻辑,程序员不去定义业务异常流程。- 给用户友好的提示
在发现异常情况后,代码进行特殊处理后,给用户友好的提示,不能直接抛出异常到用户界面。
接口层面异常处理原则
- 输入、输出参数校验
接口服务提供方一般要对输入参数做校验,校验通过后,才会提供服务。接口调用方一般要对输出参数做校验,校验通过后,才会使用服务。- 请求和响应的日志记录
接口要对请求和响应做好日志记录,这在后期遇到问题反查的时候特别重要。- 接口超时等异常的业务处理
接口开发时,经常会遇到接口超时等网络问题,因此在开发的过程中,尤其要处理好这些异常。比如:超时反查机制,超时重发机制等。
##Java 异常处理机制介绍
所有的异常跟错误都继承于 Throwable 类,也就是说所有的异常都是一个对象。Exception 类是 Throwable 类的子类,除了 Exception 类外,Throwable 还有一个子类 Error 。
###Error(错误)
Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在 Java 程序处理的范畴之外。Error 用来指示运行时环境发生的错误。
例如:JVM 运行时出现的 OutOfMemoryError 以及 Socket 编程时出现的端口占用等程序无法处理的错误。程序一般不会从错误中恢复。
###Exception(异常)
- 运行时异常(RuntimeException 及其之类的异常)
此类异常代码编写的时候不会被编译器所检测出来,是可以不需要被捕获即可以不处理,但是我们可以编写代码处理(使用 try…catch…finally)这样的异常。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理,这样的异常发生的原因多半是代码写的有问题(一般的做法是进行判断后处理)。
常见的 RUNtimeException 有:NullpointException(空指针异常)、ClassCastException(类型转换异常)、IndexOutOfBoundsException(数组越界异常)等。
- 编译异常(RuntimeException 以外的异常)
这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。在方法中要么用 try…catch 语句捕获它并处理,要么用 throws 子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。
常见编译异常有:IOException(流传输异常)、SQLException(数据库操作异常)等。
###Java处理异常的机制
异常总是先被抛出,后被捕捉的
- 抛出异常
- 捕获异常
##异常处理对项目质量的影响
- 空指针异常
NPE是Java程序员最不能忍受的异常,如果NPE没处理好展示到用户的眼里,那么他可能是个假的程序员。
NPE的处理很简单,就是在使用一个对象的时候,记得加一层非空判断
/**
* 用户自定义异常
*/
public class MyException extends RuntimeException {
/**
* 错误码
*/
private String errorCode;
/**
* 错误原因
*/
private String errorMsg;
/**
* 错误原因枚举
*/
private ResultCodeEnum resultCodeEnum;
/**
* 构造器
*
* @param resultCodeEnum
*/
public MyException(ResultCodeEnum resultCodeEnum) {
super();
this.errorCode = resultCodeEnum.getCode();
this.errorMsg = resultCodeEnum.getDesc();
}
public MyException(String errorCode, String errorMsg) {
super();
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
}