抓抛模式
抓:
- try-catch-finally 捕获异常后进行处理
- throws直接抛出异常
抛:
throw抛出
throws 和throw的区别
throws是异常处理的方式;声明在方法上;将异常对象捕获抛给调用者处理
throw 是抛出异常对象;声明在方法内;
受检异常和非受检异常的区别
- RuntimeException 是非受检异常,这类异常要么是系统异常或程序逻辑错误,通常不会在编译时被检测,不需要进行处理
- 受检异常是RuntimeException以外的异常,必须进行处理,否则会有编译错误
error和Exception的区别
- 相同:都继承Throwable
- 不同:
error通常为系统运行时的内部错误,不需捕获
Exception分为由程序错误导致的RuntimeException(非受检异常),和由程序本身没有问题的非RuntimeException(受检异常)
异常处理方式
- 直接抛出throws
- 封装后再抛出:自定义异常对象再throw
- 捕获异常try-catch根据不同的异常分别处理
- 自定义异常
- try-catch-finally:try中异常之后的代码不再执行,finally里的代码一定会执行
- 实现AutoCloseable接口:解决finally中可能会发生异常的问题,调用close()自动释放资源,即使有异常也会被压制,抛出的仍为原始异常,可通过getSuppressed()获取异常列表
自定义异常
- 需继承Exception类或其子类
- 重写构造方法
建议先自定义一个根异常BaseException,然后派生出其他业务类型的异常
具体异常
Exception
- RuntimeException
NullPointException,IndexOutOfBoundsException - 非RuntimeException
IOException,FileNotFoundException,SQLException
项目异常处理
首先,定义一个基础类,所有action继承该类,返回值是定义好的响应类。该基础类里定义好成功或失败的方法,响应类定义好响应码,数据,描述信息。
其次在action里将代码用try-catch包起来,先接RuntimeExcetion异常,再接Exception异常
最后打印日志,用slf4j的日志处理,logger.info打印日志,logger.info("—处理—{}",param);
Service层直接向上抛出异常,使用定义好的异常处理类
项目异常日志打印
本地通过log4j2.xml配置控制台输出,服务器通过输出到指定文件
log4j2.xml通过配置打印器和输出介质
服务器通过.sh文件配置日志输出路径