zoukankan      html  css  js  c++  java
  • 异常处理、抛出异常

    一、异常处理机制

     Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。

            抛出异常当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。

            捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

     

    二、捕获异常try...catch...finally..

     try {  

        // 可能会发生异常的程序代码  

    } catch (xxxException e1 {  

        // 捕获并处理try抛出的异常类型Type1  

    } catch (xxxException e2) {  

    // 捕获并处理try抛出的异常类型Type2  

    .....

    finally {  

        // 无论是否发生异常,都将执行的语句块  

    综上所述:

    try  该代码块中编写可能产生异常的代码。

    catch 用来进行某种异常的捕获,实现对捕获到的异常进行处理。

    finally  有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

    finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:
    1)在finally语句块中发生了异常。
    2)在前面的代码中用了System.exit()退出程序。
    3)程序所在的线程死亡。
    4)关闭CPU

    三、异常处理

    1.异常处理器(自定义异常)

    springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。

    1)异常处理思路

    系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

    系统的daoservicecontroller出现都通过throws Exception向上抛出,最后由springmvc前端控制器DispacherServlet交由异常处理器进行异常处理,如下图

    2) 自定义异常类

    使用步骤:

    1、定义异常类,继承Exception,或者继承RuntimeException

    2、重写构造方法,在构造方法中,super将异常信息,传递给父类

    3、通过throw异常对象,使用该异常。

    为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controllerservicedao抛出此类异常说明是系统预期处理的异常信息。

    /**
    
     * 创建一个自定义异常类,它继承了Exception,可以捕获所有异常信息。
    
     * @author admin
    
     */
    
    public class CustomException extends Exception {
    
    
    // 定义变量,存储异常信息
    
    private String message;
    
    public String getMessage() {
    
    return message;
    
    }
    
     
    
    public void setMessage(String message) {
    
    this.message = message;
    
    }
    
    
    // 创建构造方法
    
    public CustomException(String message){
    
    super(message);
    
    this.message = message;
    
    }
    }

    3)自定义异常处理器

    1)自定义异常类:继承Exception类,定义异常信息;

    2)自定义异常处理器:

    实现接口HandlerExceptionResolver

    重写resolveException方法();

    判断抛出异常是否为自定义异常;如果是,直接异常转换;否则,重构系统错误常;

    创建视图解析器,保存异常信息,返回页面;

    3)springmvc.xml文件中配置自定义异常处理器交由srpingmvc管理;

    4)编写一个异常信息展示页面;

    public class CustomExceptionResoler implements HandlerExceptionResolver {
    
     
    
    @Override
    
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
    
    Exception ex) {
    
    String msg = null;
    
    // 定义 自定义异常类
    
    CustomException customException = null;
    
    // 判断抛出异常是否为自定义异常
    
    if (ex instanceof CustomException) {
    
    // 是,直接异常转换:获取异常展示到页面
    
    customException = (CustomException) ex;
    
    msg = customException.getMessage();
    
    } else {
    
    // 否,重新构造一个系统错误的异常
    
    customException = new CustomException("系统错误,请与管理员联系!");
    
    ex.printStackTrace(); // 想控制台打印异常信息;
    
    StringWriter s = new StringWriter();
    
    PrintWriter printWriter = new PrintWriter(s);
    
    ex.printStackTrace(printWriter);
    
    msg = s.toString();
    
    }
    
    // 执行操作 写日志、发短信、发邮件...
    
     
    
    // 创建视图解析器对象
    
    ModelAndView modelAndView = new ModelAndView();
    
    // 存储异常信息
    
    modelAndView.addObject("message", msg);
    
    modelAndView.setViewName("error");
    
     
    
    // 将异常信息返回
    
    return modelAndView;
    
    }
    
    }
    

      

    4)错误信心展示页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    
    pageEncoding="UTF-8"%>
    
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <html>
    
    <head>
    
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    <title>错误页面</title>
    
     
    
    </head>
    
    <body>
    
    您的操作出现错误如下:
    
    <br /> ${message }
    
    </body>
    
    </html>

    5)异常处理器的配置

    springmvc.xml引入自定义异常处理器的bean

    <!-- 自定义全局异常处理器 -->

    <bean id="handlerExceptionResolver" class="cn.ssm.mycustom.exceptionResolver.CustomExceptionResolver"/>

     

    2.配置web.xml的方式处理异常

    web.xml文件中配置:

    <!-- 第二种方式:配置处理异常 -->

    <error-page>
    
    <!-- 404异常 -->
    
    <error-code>404</error-code>
    
    <!-- 异常展示页面 -->
    
    <location>/404.jsp</location>
    
    </error-page>
    
    <error-page>
    
    <error-code>500</error-code>
    
    <location>/500.jsp</location>
    
    </error-page>

    其中,404.jsp500.jsp是自定义异常提示页面。

  • 相关阅读:
    寒假第七天
    寒假第六天
    寒假第五天
    寒假第四天
    leetcode 105 从前序与中序遍历序列构造二叉树
    leetcode 268 丢失的数字
    leetcode 141 环形链表
    判断顶点是否在三角形内部
    java 基本数据类型
    leetcode 20 有效的括号
  • 原文地址:https://www.cnblogs.com/blogslee/p/7043561.html
Copyright © 2011-2022 走看看