在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的。那么如何保证我们处理异常的代码精简且便于维护呢?下面是异常处理几种方式
1,使用SimpleMappingExceptionResolver实现异常处理
applicationContext.xml中配置
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面 -->
<property name="defaultErrorView" value="error"></property>
<!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,页名作为值 -->
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">error</prop>
<prop key="java.lang.ArithmeticException">arithMeticExcetionError</prop>
</props>
</property>
</bean>
2,实现HandlerExceptionResolver接口实现自己的处理方法,如
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
// 添加自己的异常处理逻辑,如日志记录等
return new ModelAndView("exception");
}
}
然后配置文件配置
<bean id="exceptionResolver" class="包名.MyHandlerExceptionResolver"/>
public class BaseController {
@ExceptionHandler
public String exception(HttpServletRequest request, Exception e) { //添加自己的异常处理逻辑,如日志记录
request.setAttribute("exceptionMessage", e.getMessage()); // 根据不同的异常类型进行不同处理
if(e instanceof SQLException) return "testerror"; else
return "error";
}
}
然后让其他的需要使用此异常的Controller继承 BaseController
@RestController
public class ArticleCotroller extends BaseController{
@RequestMapping("/articles")
public Object getArticleList(){
Map<String, Object> params=getPageMap();
List<ArticleListDto> listDtos=articleService.getArticleList(params);
int i = 1/0;
return setResponseMap(CodeMessage.C_SUCCESS, "查询成功", listDtos);
}