异常主要分为:错误、一般性异常(检查异常)、运行期异常(非受控异常)
自定义异常通常继承于 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);
}
}
SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver(要自定义异常类需要时间该接口)
HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和
SimpleMappingExceptionResolver
SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver,使用方式:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArithmeticException">errorprop>
props>
property>
<property name="exceptionAttribute" value="ex">property>
bean>
实例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:
@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());
}
}