Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并处理异常
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6403033.html
在项目中的应用见: https://github.com/ygj0930/CoupleSpace
Java本身定义了两个throwable类的子类,error类与exception类。而这些原生的异常除非是开发人员,否则一般人是看不懂的。那怎么办呢?我们可以在开发时,继承异常类,来自定义异常,并且在View层统一处理异常将之转变为用户能懂的信息以及控制项目跳过异常操作,维持项目的正常运行。
一:自定义Error类或Exception类
public class BaseError extends Error
{
protected String key;
protected Object[] args; /**
*
* @param key 异常提示信息
*/
public BaseError(String key)
{
super(key);
this.key = key;
} /**
*
* @param key 异常提示信息
* @param cause 异常对象
*/
public BaseError(String key, Throwable cause)
{
super(key, cause);
this.key = key;
} /**
*
* @param key 异常提示信息
* @param args 在抛异常时把某些数据也抛给异常处理者
*/
public BaseError(String key, Object ... args)
{
super(key);
this.key = key;
this.args = args;
} /**
*
* @param key 异常提示信息
* @param cause 异常对象
* @param args 在抛异常时把某些数据也抛给异常处理者
*/
public BaseError(String key, Throwable cause, Object ... args)
{
super(key, cause);
this.key = key;
this.args = args;
} //在捕获并处理异常时,获取异常的详细信息。比如在filter层统一处理异常时通过以下方法获取所处理异常的信息来在view层作出应答
public String getKey()
{
return key;
} public Object[] getArgs()
{
return args;
}
}
public class MyException extends RuntimeException {
protected String key;
protected Object[] args;
public MyException(String key)
{
super(key);
this.key = key;
}
public MyException(String key, Throwable cause)
{
super(key, cause);
this.key = key;
}
public MyException(String key, Object ... args)
{
super(key);
this.key = key;
this.args = args;
}
public MyException(String key, Throwable cause, Object ... args)
{
super(key, cause);
this.key = key;
this.args = args;
}
public String getKey()
{
return key;
}
public Object[] getArgs()
{
return args;
}
}
Error和Exception都是实现了Throwable接口的,二者的区别主要在于:程度的不同。
Error是系统机器的错误,比如虚拟机内存溢出等严重问题,通常出现系统异常的时候项目都已经要停止运行的了。一般不会对error进行捕捉和处理,因为这些问题不是代码可以修复的。
而Exception一般是运行过程中出现的逻辑错误、误操作等轻度的问题,不会导致项目停止运行,只不过引发异常的操作不能正常完成而已。对于异常,我们一般进行捕捉处理,转化为runtime异常的子类进行抛出,在过滤器统一进行处理以提供良好的用户体验并维持项目继续运。
二:在项目代码的try-catch()块中包装异常
在项目代码中,有可能出现异常、运行错误的地方,用try-catch语句捕捉异常。把异常记录到日志后,再把捕获的异常包装成自定义异常(注意:自定义的异常必须是继承自RuntimeException的才可以抛出。其他Exception的不可以的)进行抛出。在一个filter处进行统一的拦截处理,作出用户能理解的处理提示并进行有效的异常控制,以免项目崩溃,使得用户跳过异常操作继续使用项目。
比如:
try{
数据库操作
} catch (ClassNotFoundException e) {
logger.error("ClassNotFoundException in ArticleDAO!", e);
throw new MyException("ClassNotFoundError", e);
} catch (SQLException e) {
logger.error("SQLException in ArticleDAO!", e);
throw new MyException("SQLError", e);
}
三:配置一个过滤器位于过滤链的顶端,对所有进出项目的异常进行捕捉处理。
根据所捕捉到的异常不同来进行不同的提示信息,并控制项目在发生异常后如何响应,以维持项目继续运行。
比如:
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
String err="";
try {
arg2.doFilter(arg0, arg1);
}catch(Error e){
err="系统错误";
}catch(MyException e){
err=e.getKey();
}catch (Exception e) {
err="系统异常";
}
PrintWriter out = arg1.getWriter();
if(!err.equals("")){
out.print("<script>alert('"+err+"');window.location='index.jsp';</script>");
out.close();} }
切记,这个过滤器需配置在过滤链的第一位!
Java继承Exception自定义异常类教程以及Javaweb中用Filter拦截并处理异常的更多相关文章
- 设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。
设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”,则抛出一个异常信息“This is a XYZ”,如果从命令行输入 ABC,则没有抛出异常.(只有 ...
- java基础之自定义异常类及throw和throws的区别
一.异常的架构: Throwable类:所以异常类都是Throwable的子类,它派生两个子类 Error和Exception. Error类:表示仅靠程序本身无法恢复的的严重错误,比如内存溢出,虚拟 ...
- 类ExampleA继承Exception,类ExampleB继承ExampleA。 有如下代码片断:
try { throw new ExampleB("b") } catch(ExampleA e){ System.out.println("ExampleA" ...
- 类Exception_A继承Exception,类Exception_B继承Exception_A,请问执行此段代码的输出是什么?
@Test public void Test_Exception() { try { throw new ExceptionB("A"); } catch (ExceptionA ...
- javaweb利用filter拦截请求
项目上有个小需求,要限制访问者的IP,屏蔽未授权的登录请求.该场景使用过滤器来做再合适不过了. SecurityFilter.java: package com.lichmama.webdemo.fi ...
- javaweb利用filter拦截未授权请求
项目上有个小需求,要限制访问者的IP,屏蔽未授权的请求.该场景使用过滤器来做再合适不过了. SecurityFilter.java: public class SecurityFilter imple ...
- Java自定义异常类
用户可以根据自己的需要定义自己的异常类,定义异常类只需要继承Exception类即可 //================================================= // Fi ...
- Java -- 异常的捕获及处理 -- 自定义异常类
7.4 自定义异常类 定义异常类只需要继承Exception类即可. 例:自定义异常类 Class : MyException package limeThrowable._7_4; public c ...
- Java中的异常处理:何时抛出异常,何时捕获异常,何时处理异常?
Java中的异常处理:何时抛出异常,何时捕获异常? 2017-06-07 1 异常分类 Throwable对象可以分为两组: 一组是unchecked异常,异常处理机制往往不用于这组异常,包括: Er ...
随机推荐
- 好用的批量改名工具——文件批量改名工具V2.0 绿色版
我找了一个绿色免安装的软件来实现批量改名要求 下载地址:http://www.orsoon.com/Soft/14049.html#xiazai 添加图片后,开始改名.通过输入a#就可以将这些图片进行 ...
- java.io包的总体框架图(转)
原文链接:java.io包的总体框架图, 便于记忆!
- Verilog 加法器和减法器(4)
类似于行波进位加法器,用串联的方法也能够实现多位二进制数的减法操作. 比如下图是4位二进制减法逻辑电路图. 8位二进制减法的verilog代码如下: module subn(x, y, d,cin) ...
- mybatis中sql标签、where标签、foreach标签用法
<sql id="query_user_where"> <!-- 如果 userQueryVo中传入查询条件,再进行sql拼接--> <!-- tes ...
- [转]Chart.js入门教程
Chart.js是一个简单.面向对象.为设计者和开发者准备的图表绘制工具库. 相信大部分人都一样,看到一大筐用文本或者表格形式呈现的数据就头疼.因为这种呈现方式也太无聊了吧...而且这对于我们处理原始 ...
- Android -- isInEditMode
解释 Indicates whether this View is currently in edit mode. A View is usually in edit mode when displa ...
- 调用百度、高德地图App,百度地图网页版,App定位
https://www.jianshu.com/p/296a3995adc2 https://blog.csdn.net/qq_26598821/article/details/51087785 ht ...
- 深入理解FFM原理与实践
原文:http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html 深入理解FFM原理与实践 del2 ...
- LINUX 查找tomcat日志关键词
#查询catalina.out日志文件中的关键词为2016-04-13 11:26:00的日志信息 grep -C 10 '2016-04-13 11:26:00' catalina.out |mor ...
- oauth2-server-php-docs 授权控制器
授权控制器 概观 对于授权端点,要求用户使用authorization code(授权码授权类型)或access token(隐式授权类型)对客户端进行认证和重定向. 方法 handleAuthori ...