0 课程地址
https://www.imooc.com/video/16724/0
1 demo
1.1 demo
ErrorHandler.java
package com.example.demo.exception; import com.example.demo.tools.JSONResult; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * ErrorHandler * * @author 魏豆豆 * @date 2020/12/6 */ @Controller /** *@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解 */ @RequestMapping("/error") public class ErrorHandler { @RequestMapping("/err") public String error(){ int a = 1/0; return "templates/error"; } @RequestMapping("/errAjax") public String errorAjax(){ return "thymeleaf/ajaxerror"; } @RequestMapping("/getAjaxerror") @ResponseBody public JSONResult getAjaxerror(){ int a = 1/0; return JSONResult.ok(); } }
ajaxerror.html
<!DOCTYPE html > <html> <head lang="en"> <meta charset="UTF-8" /> <title></title> <script th:src="@{/static/js/jquery.min.js}"></script> </head> <body> aaaaa <h1>测试ajax错误异常</h1> <script th:src="@{/static/js/ajaxerror.js}"></script> </body> </html>
ajaxerror.js
$.ajax({
<!--注意:因为我application.properties 中配置了IMooc(server.servlet.context-path=/IMooc),所以这里需要加上/IMooc--> url: "/IMooc/error/getAjaxerror", type: "POST", async: false, success: function(data) { if(data.status == 200 && data.msg == "OK") { alert("success"); } else { alert("发生异常:" + data.msg); } }, error: function (response, ajaxOptions, thrownError) { debugger; alert("error"); } });
ErrorHandler.java
@RequestMapping("/getAjaxerror") @ResponseBody public JSONResult getAjaxerror(){ int a = 1/0; return JSONResult.ok(); }
IMoocAjaxExceptionHandler.java (获取异常通知)
package com.example.demo.exception; import com.example.demo.tools.JSONResult; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; /** * IMoocAjaxExceptionHandler * * @author 魏豆豆 * @date 2020/12/6 */ @RestControllerAdvice /** * @RestControllerAdvice = @ResponseBody +@Controller */ public class IMoocAjaxExceptionHandler { @ExceptionHandler(value = Exception.class) public JSONResult errorHandler(HttpServletRequest request,Exception e) throws Exception{ e.printStackTrace(); return JSONResult.errorException(e.getMessage()); } }
ajaxerror.js
$.ajax({
<!--注意:因为我application.properties 中配置了IMooc(server.servlet.context-path=/IMooc),所以这里需要加上/IMooc--> url: "/IMooc/error/getAjaxerror", type: "POST", async: false, success: function(data) { if(data.status == 200 && data.msg == "OK") { alert("success"); } else { alert("发生异常:" + data.msg); } }, error: function (response, ajaxOptions, thrownError) { debugger; alert("error"); } });
打印日志:
2020-12-10 23:05:02.339 INFO 16200 --- [nio-8088-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/IMooc] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2020-12-10 23:05:02.339 INFO 16200 --- [nio-8088-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2020-12-10 23:05:02.339 INFO 16200 --- [nio-8088-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms java.lang.ArithmeticException: / by zero at com.example.demo.exception.ErrorHandler.getAjaxerror(ErrorHandler.java:37) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:807) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) 2020-12-10 23:06:04.783 WARN 16200 --- [io-8088-exec-10] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [java.lang.ArithmeticException: / by zero]
页面展示:
诸葛