异常处理、抛出异常

一、异常处理机制

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,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

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

2) 自定义异常类

使用步骤:

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

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

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

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

/**

 * 创建一个自定义异常类,它继承了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.jsp和500.jsp是自定义异常提示页面。

时间: 2024-10-13 17:06:09

异常处理、抛出异常的相关文章

Flask框架之异常处理和请求钩子

异常处理 抛出异常 在Flask框架中,我们使用abort()方法,抛出异常信息. 代码如下: from flask import abort # 抛出异常 @app.route('/error') def error(): return abort(404) 捕获和处理异常 在Flask框架中,我们使用@app.errorhandler()装饰器,实现异常的捕获和处理. 代码如下: # 捕获异常 @app.errorhandler(404) def error_action(e): # 必须接

云平台项目-----总结

2015年4月份至今,我开始参与公司云平台设计与开发,为了巩固知识点,整理一些项目中用到的技术,以下是简要的介绍: 项目要求及特点:    高可用,高并发,多线程,大数据量,多节点 开发语言:            java 设计工具:            VISIO,EA,WORD =========中间件========== Karaf              osgi容器,bundle可插拔,模块化开发 ActiveMq         消息队列中间件 Dubbo          

输出异常

异常处理--抛出异常 代码如下: package Day09; public class TestInt { public static void main(String[] args) { int num = Integer.MAX_VALUE-1; System.out.println(num); try { num = intAddOne(num); } catch (Exception e) { e.printStackTrace(); } System.out.print(num);

黑马程序员_Springmvc+Mybatis由浅入深全套视频教程video-视频列表

\mybatis\day01\01mybatis第一天课程安排.avi; \mybatis\day01\02原生态jdbc编程中的问题总结.avi; \mybatis\day01\03mybatis框架原理.avi; \mybatis\day01\04mybatis入门程序-工程结构.avi; \mybatis\day01\05mybatis入门程序-根据id查询用户-映射文件.avi; \mybatis\day01\06mybatis入门程序-根据id查询用户-程序代码.avi; \mybat

Lua总结

ref http://book.luaer.cn/ 基础 弱类型,没有类型定义 解释型语言,但是会通过编译器先编译成中间码然后再执行 字符串的处理:用table保存,最后table.concat(t, "\n") .. "\n".防止..引起的性能问题 注释: -- 块注释:-[[ ]] 没有++,+= 打印:print(a, b, c, "", 1) 字符串:'或者"均可 或者[[包含'和"]] 不需要声明类型,语句结束不需

Python3 错误和异常

Edit 笔记内容:Python3 错误和异常 笔记日期:2017-11-12 Python3 错误和异常 语法错误 异常 异常处理 抛出异常 用户自定义异常 finally语句 预定义的清理行为 异常处理机制概述: 异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件).通过异常处理,我们可以对用户在程序中的非法输入进行控制和提示,以防程序崩溃. 就好比一个旅游景点,每到一个有可能出现问题情况的地方就会设置一个处理问题的处理

最快的 Python Web 框架入门

速度比较 框架 实现基础 每秒请求数 平均时间 Sanic Python 3.5 + uvloop 30,601 3.23ms Wheezy gunicorn + meinheld 20,244 4.94ms Falcon gunicorn + meinheld 18,972 5.27ms Bottle gunicorn + meinheld 13,596 7.36ms Flask gunicorn + meinheld 4,988 20.08ms Kyoukai Python 3.5 + uv

回顾上周所学内容及时间转化

面向对象: 对象: 万事万物皆为对象. 特征, 动作或功能放在一起的就是一个对象 对象如何创建的. 在python中对象是通过类来创建的. 类是对对象的描述.统称.约束. class Car: def fly(self): pass 类与对象的关系: 类是类型, 类别. 对事物的描述 对象是个体. 具体的某一个东西或者事物 创建对象: 类名() 实例化. 三大特征: 1. 封装. 将数据或者方法封装在一个类中. 2. 继承. 子类可以自动有用父类中除了私有内容外的所有内容. 包括了抽象方法 3.

Java中的异常处理:何时抛出异常,何时捕获异常?

1.如果方法声明名里面有throws异常,那么方法体里面可以不抛出异常.因为可以在方法声明中包含异常说明,但实际上却不抛出!这样做的好处是,为异常先占个位置,以后就可以抛出这种异常而不用修改修改已有的代码.在定义抽象基类和接口时这种能力很重要,这样派生类或接口实现类就能够抛出这些预先声明的异常. 2.为什么有的方法声明里面没有throws,但方法体里面却抛出了异常?从RuntimeException继承的异常,可以在没有异常说明throws的情况下被抛出!对于Runtime异常(也称为非检查的异

第10章-异常处理 --- 使用throw抛出异常

第10章-异常处理 --- 使用throw抛出异常 (一)抛出异常 如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可以单独使用,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例. throw语句的语法格式如下: throw ExceptionInstance; 如果throw语句抛出的异常是Checked异常,则该throw语句要么处于try块里,显示捕获该异常,要么放在一个带throws声明抛出的方法中,即把该异常交给该方法的调用者处理;如果