废话前言
作为一个码农想必对异常这一块滴已经是相当熟悉了就是我们常说的try/catch/finally吗,然后抛出捕获的异常信息,那么当我们在开发中有些异常需要我们给出特定的提示统一对异常进行处理展示可能就会用到自定义异常。
第一:先说一下平时常用常见的异常
(1)运行时异常(checked exception):继承自java.lang. RuntimeException类
常见5种:
ClassCastException(类型转换异常)
IndexOutOfBoundsException(数组越界)
NullPointerException(空指针)
ArrayStoreException(数据存储异常,操作数组时类型不一致)
BufferOverflowException(IO操作的异常)
(2)非运行时异常(unchecked exception):继承自java.lang.Exception类
常见:
Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
java.io.IOException
先给出语法:
try{
//try块中放可能发生异常的代码。
//如果执行完try且不发生异常,则接着去执行finally块和finally后面的代码(如果有的话)。
//如果发生异常,则尝试去匹配catch块。
}catch(SQLException SQLexception){
//每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。Java7中可以将多个异常声明在一个catch中。
//catch后面的括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。
//在catch块中可以使用这个块的异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问。
//如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally,然后到这个函数的外部caller中去匹配异常处理器。
//如果try中没有发生异常,则所有的catch块将被忽略。
}catch(Exception exception){
//…
}finally{
//finally块通常是可选的。
//无论异常是否发生,异常是否匹配被处理,finally都会执行。
//一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。
//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
}
代码例子:
public class Class1 {
public static void main(String[] args) throws Exception {
try {
List<String> list = new ArrayList<String>();
Class2 c = new Class2();
c.aa(list);
System.out.println("打印");
}catch(Exception e) {
System.out.println(">>>>>>>>>>>main");
e.printStackTrace();
}finally {
System.out.println("main finally");
}
}
}
public class Class2 {
public String aa(List<String> list) throws Exception{
try {
list.get(10);
}catch(Exception e) {
System.out.println(">>>>>>class2 aa="+e.getMessage());
e.printStackTrace();
throw e; //必须throw调用方法还会停止向下运行,并被调用方法接住并抛出
}finally {
System.out.println("finally");
}
return null;
}
}
第二:说一下我用到的自定义异常
自定义异常的好处是什么?
(1)统一了对外异常展示的方式给前台或者各个服务接口
(2)使用自定义异常继承相关的异常来抛出处理后的异常信息可以隐藏底层的异常,这样更安全,异常信息也更加的直观
我是如何在项目中使用的场景?
直接上代码
一:自定义异常类
public class ExceptionMessage extends Exception {
public ExceptionMessage(String message) {
super(message);
}
}
二:自定义异常处理类
@RestControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(ExceptionMessage.class)
public String handlerMyException(ExceptionMessage ex) {
//BaseRspsMsg自定义错误代码
BaseRspsMsg baseRspsMsg = BaseRspsMsg.build(BaseRspsMsg.BIZ_CODE_00001_FAILE,ex.getMessage());
return baseRspsMsg.toJsonStr();
}
}
三:代码调用
boolean isTrue = 处理逻辑是否符合;
if (!isTrue) {
errDesc = "ERROR_异常信息描述!" ;
throw new ExceptionMessage(errDesc);
}