一、使用@ExceptionHandler进行处理1、创建异常基类,使用@ExceptionHandler声明异常处理BusinessException和SystemException为自定义异常类,代码如下:packagecom.twosnail.exception;importjavax.servlet.http.HttpServletRequest;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.ExceptionHandler;@ControllerpublicclassBasicExController{/***基于@ExceptionHandler异常处理基类*@return*/@ExceptionHandlerpublicStringexception(HttpServletRequestrequest,Exceptionex){//根据不同的错误切换到不同的页面if(exinstanceofBusinessException){return"business-error";}elseif(exinstanceofSystemException){返回“系统错误”;}else{返回“错误”;}}}2.让所有需要异常处理的Controller都继承这个类,如下所示:准确显示定义的异常处理页面,达到统一异常处理的目的。总结:使用@ExceptionHandler注解实现异常处理具有集成简单、扩展性好(只需要从BasicExController继承Controller类即可进行异常处理)、不需要额外的Spring配置等优点,但是这个方法是不存在的对于已有代??码具有侵入性(需要修改已有代码继承BasicExController),异常处理时无法获取异常以外的数据。2、SimpleMappingExceptionResolverSimpleMappingExceptionResolver有两种配置方式,可以根据自己的需要来确定。配置代码如下:1、第一种方法,在Spring的配置文件中,添加如下内容:这里可以设置对应的跳转页面。business-errorsystem-error5004042.第二个,通过自定义java类,继承SimpleMappingExceptionResolver,然后在Spring中配置代码如下:error/500错误/errorpage错误/500java类的代码如下,这里可以处理相应的逻辑,如下,分别处理jsp页面和json数据:packagecom.twosnail.exception;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.http.HttpServletRequest;导入javax.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.ModelAndView;importorg.springframework.web.servlet.handler.SimpleMappingExceptionResolver;publicclassMyselfSimpleMappingExceptionResolverextendsSimpleMappingExceptionResolver{@OverrideModelViprotectedewdoResolveException(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){//ExposeModelAndViewforchosenerrorview.StringviewName=determineViewName(ex,request);if(viewName!=null){//JSP格式返回if(!(request.getHeader("accept").indexOf("application/json")>-1||(request.getHeader("X-Requested-With")!=null&&request.getHeader("X-Requested-With").indexOf("XMLHttpRequest")>-1))){//如果不是异常请求//ApplyHTTPstatuscodeforerrorviews,ifspecified.//仅当我们正在处理顶级请求时才应用它。IntegerstatusCode=determineStatusCode(request,viewName);如果(statusCode!=null){applyStatusCodeIfPossible(请求,响应,statusCode);}returngetModelAndView(viewName,ex,request);}else{//JSON格式返回try{PrintWriterwriter=response.getWriter();writer.write(ex.getMessage());writer.flush();}catch(IOExceptione){e.printStackTrace();}返回空;}}else{返回空;}}}总结:使用SimpleMappingExceptionResolver进行异常处理,具有集成简单、扩展性好、不侵入现有代码等优点。但是方法一只能获取异常信息。如果发生异常,则需要获取异常以外的数据。不适用的情况三、HandlerExceptionResolver自定义异常1、在Spring配置文件中,添加如下内容:2.添加一个自定义的MyExceptionHandler类,代码如下:这里将异常路径单独打印出来,方便在日志中查看,并对SystemException异常进行特殊处理:packagecom.twosnail.exception;导入java.util.Map;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.HandlerExceptionResolver;importorg.springframework.web.servlet.ModelAndView;importorg.springframework.web.servlet.View;importorg.springframework.web.servlet.view.RedirectView;publicclassMyExceptionHandlerimplementsHandlerExceptionResolver{publicModelAndViewresolveException(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionexception){System.out.println("【抛出异常】--异常路径为:"+request.getServletPath()+"\n【异常信息】--"+exception.getMessage());//如果没有抛出action业务异常,则不处理if(!(exceptioninstanceofSystemException)){returnnull;}finalSystemExceptionactionE=(SystemException)异常;模型和视图模型=空;if(actionE.getForwardType()==SystemException.FORWARD){//进入页面渲染model=newModelAndView(actionE.getModelPath(),actionE.getAttributes());}elseif(actionE.getForwardType()==SystemException.REDIRECT){model=newModelAndView(newRedirectView(actionE.getModelPath(),true));}else{//直接返回页面内容model=newModelAndView(newView(){@Overridepublicvoidrender(Maparg0,HttpServletRequestarg1,HttpServletResponsearg2)throwsException{arg2.setContentType("text/html");arg2.setCharacterEncoding(actionE.getEncode());if(actionE.getResponseBody()!=null){arg2.getWriter().print(actionE.getResponseBody());}}@OverridepublicStringgetContentType(){返回"text/html;charset=utf-8";}});返回模型;}}总结:从上面的集成过程可以看出,使用实现了HandlerExceptionResolver接口的异常处理器进行异常处理,具有集成简单、扩展性好、不侵入现有代码等优点。在异常处理时可以获取引发异常的对象,有利于提供更详细的异常处理信息。而SimpleMappingExceptionResolver是HandlerExceptionResolver的默认实现类。4.项目截图代码地址:双蜗牛源码地址参考资料:实战中使用SpringMVC统一异常处理原作者:双蜗牛