1.异常
1.1 异常结构层次
异常主要分为:错误、一般性异常(检查异常)、运行期异常(非受控异常)
- 错误:如果应用程序出现了 Error,那么将无法恢复,只能重新启动应用程序,最典型的
Error 的异常是:OutOfMemoryError - 检查异常:出现了这种异常必须显示的处理,不显示处理 java 程序将无法编译通过
- 非受控异常:此种异常可以不用显示的处理,例如被 0 除异常,java 没有要求我们一定要处理
1.2自定义异常
自定义异常通常继承于 Exception 或 RuntimeException,到底继承那个应该看具体情况来定。
import java.io.*;
public class ExceptionTest20 {
public static void main(String[] args) {
method1(10, 0);
}
private static void method1(int value1, int value2){
//throws MyException {
if (value2 == 0) {
//抛出非受控异常,方法可以不适用throws 进行声明
//但也也可以显示的声明
throw new MyException("除数为 0");
}
int value3 = value1 / value2;
System.out.println(value3);
}
}
//自定义非受控异常
class MyException extends RuntimeException {
public MyException() {
//调用父类的默认构造函数
super();
}
public MyException(String message) {
//手动调用父类的构造方法
super(message);
}
}
2.SpringMVC异常处理器
2.1 基于配置的异常处理
SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver(要自定义异常类需要时间该接口)
HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和
SimpleMappingExceptionResolver
SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver,使用方式:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--进行异常视图映射,当触发xx异常,就跳转到相应视图
exceptionMappings和exceptionAttribute都是SimpleMappingExceptionResolver这个类中的属性
-->
<property name="exceptionMappings">
<props>
<!--键表示处理器方法执行过程中出现的异常 ,值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面
-->
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
<!--exceptionAttribute:
设置一个属性名,将出现的异常信息在请求域中进行共享
ex表示传送到前端数据中的key
-->
<property name="exceptionAttribute" value="ex"></property>
</bean>
2.2 基于注解的异常处理
实例1:
//@ControllerAdvice将当前类标识为异常处理的组件
@ControllerAdvice
public class ExceptionController {
//@ExceptionHandler用于设置所标识方法处理的异常
@ExceptionHandler(ArithmeticException.class)
//ex表示当前请求处理中出现的异常对象
public String handleArithmeticException(Exception ex, Model model){
model.addAttribute("ex", ex);
return "error";
}
}
实例2:
2.3 @RestControllerAdvice @ExceptionHandler
3.全局异常处理
@ControllerAdvice //控制器增强类
@Slf4j
public class ExceptionCatch {
/**
* 处理不可控异常
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public ResponseResult exception(Exception e){
e.printStackTrace();
log.error("catch exception:{}",e.getMessage());
return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR);
}
/**
* 处理可控异常 自定义异常
* @param e
* @return
*/
@ExceptionHandler(CustomException.class)
@ResponseBody
public ResponseResult exception(CustomException e){
log.error("catch exception:{}",e);
return ResponseResult.errorResult(e.getAppHttpCodeEnum());
}
}