当前位置: 首页 > 图灵资讯 > 技术篇> 异常处理

异常处理

来源:图灵教育
时间:2023-06-08 09:21:46

1.常用的SpringMVC框架处理方法:561.1异常处理:56

Springmvc框架采用统一、全局异常处理。

将controller中的所有异常处理集中在一个地方。采用aop的思想。将业务逻辑与异常处理代码分开。解耦合。

1.2使用两个注释56

1.@ExceptionHandler

2.@ControllerAdvice

2.@Exceptiondler

使用注释@ExceptionHandler可以将一种方法指定为异常处理方法。只有一个注释

选择属性value作为Class数组,用于指定注释方法的异常类别,即匹配

配的异常。

ModelAndViewwew可以是注释方法的返回值、String,或者void,方法名随意,方法

参数可以是Exception及其子类对象HttpServletRequest、Httpservletresponse等。系统会自动赋值这些方法的参数。

Controller还可以直接注解异常处理注解的用法。

3.577自定义异常类别3.1异常处理步骤:1.新建mavenweb项目index.jsp

 

<%--异常处理  57--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><%    String basePath = request.getScheme() + "://" +            request.getServerName() + ":" + request.getServerPort() +            request.getContextPath() + "/";%><html><head>    <title>Title</title>    <base href="<%=basePath%>" /></head><body><p>处理异常,全局异常处理</p><form action="some.do" method="post">    姓名:<input type="text" name="name"> <br/>    年龄:<input type="text" name="age"> <br/>    <input type="submit" value=“提交请求”></form></body></html>
2.加入依赖pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.bjpowernode</groupId>  <artifactId>course10</artifactId>  <version>1.0-SNAPSHOT</version>  <packaging>war</packaging>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <maven.compiler.source>1.8</maven.compiler.source>    <maven.compiler.target>1.8</maven.compiler.target>  </properties>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.11</version>      <scope>test</scope>    </dependency>    <!--依赖servlet-->    <dependency>      <groupId>javax.servlet</groupId>      <artifactId>javax.servlet-api</artifactId>      <version>3.1.0</version>      <scope>provided</scope>    </dependency>    <!--依赖springmvc-->    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-webmvc</artifactId>      <version>5.2.5.RELEASE</version>    </dependency>  </dependencies>  <build>    <plugins>      <!-- 编码编译和JDK版本 -->      <plugin>        <artifactId>maven-compiler-plugin</artifactId>        <version>3.1</version>        <configuration>          <source>1.8</source>          <target>1.8</target>        </configuration>      </plugin>    </plugins>  </build></project>
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"         version="4.0">        <servlet>        <servlet-name>myweb</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <!--自定义springmvc读取的配置文件的位置   4-->        <init-param>            <!--springmvc配置文件的位置属性-->            <param-name>contextConfigLocation</param-name>            <!--指定自定义文件的位置-->            <param-value>classpath:springmvc.xml</param-value>        </init-param>        <!--tomcat启动后,创建Servlet对象           load-on-startup:表示tomcat启动后创建对象的顺序。--tomcat启动后,创建Servlet对象           load-on-startup:表示tomcat启动后创建对象的顺序。它的值是整数,值越小,                           tomcat创建对象的时间越早。 大于等于0的整数。       -->        <load-on-startup>1</load-on-startup>    </servlet>        <servlet-mapping>        <servlet-name>myweb</servlet-name>        <!--            使用框架时, url-pattern可以使用两个值    5            1. 使用扩展名的方法, 语法 *.xxxx , xxxxx是自定义的扩展名               常用的方式 *.do, *.action, *.mvc等等               http://localhost:8080/myweb/some.do               http://localhost:8080/myweb/other.do               不能使用 *.jsp            2.使用斜杠 "/"        -->        <url-pattern>*.do</url-pattern>    </servlet-mapping></web-app>
3.新建57个自定义异常类别

父类Myuserexception,然后定义其子类Nameeexception,AgeException

父类异常Myuserexception
package com.bjpowernode.controller.exception;//演示异常处理  57public class MyUserException extends Exception {    public MyUserException() {        super();    }    public MyUserException(String message) {        super(message);    }}
Nameexcepintion
package com.bjpowernode.controller.exception;//演示异常处理  57//表示当用户名称异常时,Nameexceptionpublic class NameException extends MyUserException {    public NameException() {        super();    }    public NameException(String message) {        super(message);    }}
子类异常Ageexception
package com.bjpowernode.controller.exception;//演示异常处理  57//当年龄有问题时,抛出的异常public class AgeException extends MyUserException {    public AgeException() {        super();    }    public AgeException(String message) {        super(message);    }}
4.在controller中抛出Nameeexception,AgeExceptionMyontroller
package com.bjpowernode.controller;import com.bjpowernode.controller.exception.AgeException;import com.bjpowernode.controller.exception.MyUserException;import com.bjpowernode.controller.exception.NameException;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/** * 异常处理  57 * @RequestMapping: *    value : 所有请求地址的公共部分,称为模块名 *    位置: 把它放在类别上 */@Controllerpublic class MyController {    @RequestMapping(value = "/some.do")    public ModelAndView doSome(String name,Integer age) throws MyUserException {        ///处理some.do请求了。 相当于service调用处理的完成。 相当于service调用处理的完成。        ModelAndView mv  = new ModelAndView();        //try {        ///根据请求参数抛出异常   57        if (!"zs".equals(name)) {            throw new NameException("名字不正确!!!");        }        if (age == null || age > 80) {            throw new AgeException(年龄较大!!!");        }        //}catch(Exception e){        //   e.printStackTrace();        //}        mv.addObject("myname",name);        mv.addObject("myage",age);        mv.setViewName("show");        return mv;    }}
5.创建一个全局异常处理的普通类别571)加入类别@ControllerAdvice

增强控制器(即增加控制器-异常处理功能)

位置:以上类别。

特点:框架必须知道注释所在的包名,并且需要在springmvc中配置文件来声明组件扫描仪。

指定@ControllerAdvice所在的包名

package com.bjpowernode.handler;import com.bjpowernode.exception.AgeException;import com.bjpowernode.exception.NameException;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.servlet.ModelAndView;@ControllerAdvicepublic class GlobalExceptionHandler {}
2)在类中定义方法,并添加@ExceptionHandler57定义方法,处理异常57

处理异常的方法和控制器方法的定义一样,可以有多个参数,可以有ModelAndView,String,void,对象类型的返回值

形参:Exception,表示Controller中抛出的异常对象。异常信息可以通过形参获得。

@ExceptionHandler(异常class):表示异常类型,当发生此类异常时,由当前方法处理

处理异常的逻辑:58

1.需要在数据库和日志文件中记录异常。记录日志发生的时间、方法和异常错误的内容。

2.发送通知,通过电子邮件、短信、微信向相关人员发送异常信息。

3.给用户友好的提示。

GlobalExceptionHandler

package com.bjpowernode.handler;import com.bjpowernode.exception.AgeException;import com.bjpowernode.exception.NameException;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.servlet.ModelAndView;/** * 异常处理  57 * @ControllerAdvice : 增强控制器(即增加控制器-异常处理功能) *           位置:以上类别。 *  特点:框架必须知道注释所在的包名,并且需要在springmvc中配置文件来声明组件扫描仪。 *  指定@ControllerAdvice所在的包名 */@ControllerAdvicepublic class GlobalExceptionHandler {    ///定义方法,处理异常   57    /*        处理异常的方法与控制器方法的定义相同, 可以有多个参数,可以有ModelAndView,        String, void,对象类型的返回值        形参:Exception,表示Controller中抛出的异常对象。        异常信息可以通过形参获得。     */    //@ExceptionHandler(异常class):当这种类型出现异常时,表示异常类型,由现行方法处理    @ExceptionHandler(value = NameException.class)    public ModelAndView doNameException(Exception exception){        ///处理Nameexception异常。        /*           处理异常的逻辑:  58           1.需要记录异常, 日志文件记录在数据库中。        /*           处理异常的逻辑:  58           1.需要记录异常, 日志文件记录在数据库中。             记录日志发生的时间,哪种方法发生,内容异常错误。           2.发送通知,通过电子邮件、短信、微信向相关人员发送异常信息。           3.给用户友好的提示。         */        ModelAndView mv = new ModelAndView();        mv.addObject("msg“姓名必须是zs,其他用户无法访问”);        mv.addObject("ex",exception);        mv.setViewName("nameError");        return mv;    }    //处理Ageeexception  58    @ExceptionHandler(value = AgeException.class)    public ModelAndView doAgeException(Exception exception){        //处理Ageeexception的异常。        /*           处理异常的逻辑:           1.需要记录异常, 日志文件记录在数据库中。        /*           处理异常的逻辑:           1.需要记录异常, 日志文件记录在数据库中。             记录日志发生的时间,哪种方法发生,内容异常错误。           2.发送通知,通过电子邮件、短信、微信向相关人员发送异常信息。           3.给用户友好的提示。         */        ModelAndView mv = new ModelAndView();        mv.addObject("msg","你的年龄不能超过80岁";        mv.addObject("ex",exception);        mv.setViewName("ageError");        return mv;    }    //处理其他异常, NameException, 除Ageeexception外,不知类型异常  58    @ExceptionHandler    public ModelAndView doOtherException(Exception exception){        //处理其他异常        ModelAndView mv = new ModelAndView();        mv.addObject("msg",“其他异常”);        mv.addObject("ex",exception);        mv.setViewName("defaultError");        return mv;    }}
6.创建处理异常的视图页面58nameError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>Title  58</title></head><body>   nameError.jsp <br/>   提示用户信息:${msg} <br/>   系统异常消息:${ex.message}</body></html>
ageError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title   ageError.jsp    提示用户信息:${msg}    系统异常消息:${ex.message}
defaultError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>Title</title></head><body>   ageError.jsp <br/>   提示用户信息:${msg} <br/>   系统异常消息:${ex.message}</body></html>
7.创建springmvc配置文件58

1)组件扫描仪扫描@Controller注释

2)组件扫描器,扫描@ControllerAdvice所在的包名

3)声明注释驱动程序

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context"       xmlns:mvc="http://www.springframework.org/schema/mvc"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context        https://www.springframework.org/schema/context/spring-context.xsd        http://www.springframework.org/schema/mvc        https://www.springframework.org/schema/mvc/spring-mvc.xsd">    <!--声明组件扫描仪  8-->    <context:component-scan base-package="com.bjpowernode.controller" />    <!--声明 视图解析器在springmvc框架中, 帮助开发人员设置视图文件的路径   40-->    <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <!--前缀:视图文件的路径-->        <property name="prefix" value="/WEB-INF/view/" />        <!--后缀:视图文件扩展名称-->        <property name="suffix" value=".jsp" />    </bean>    <!--异常处理 处理所需的两个步骤  58-->    <context:component-scan base-package="com.bjpowernode.handler" />    <mvc:annotation-driven />    </beans>
8.测试59正常的数

异常处理_异常处理

name异常

异常处理_异常处理_02

age异常

异常处理_异常处理_03

其他异常

异常处理_spring_04

上一篇:

打包

下一篇:

测试我们手写的myspring框架