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 ...
随机推荐
- 福尔摩斯基本演绎法第一季/全集Elementary迅雷下载
本季Elementary Season 1 第一季(2012)看点:<福尔摩斯:基本演绎法>由CBS出品,根据<福尔摩斯>系列改编,地点从19世纪大英帝国国势鼎盛的时期搬到了2 ...
- 详细解释如何通过Android自带的方式来实现图片的裁剪——原理分析+解决方案
我们很多时候需要进行图片的裁剪,其实这个功能在android系统中已经有一套解决方案了,虽然界面和效果并不是很优秀但功能毫无疑问是完美实现了.至于,不用自带的方案怎么做自定义,这个就是后话了.本篇主要 ...
- TeXworks使用教程指南
TeXworks是Windows版本的TeX Live默认提供的编辑器.值得注意的是,TeXworks 是XeTeX 作者 Jonathan Kew 开发的,其特点是界面简洁友好,集成了轻便的 PDF ...
- [转]pear windows 安装
FROM : http://jingyan.baidu.com/article/ca41422fd8cf3d1eae99ed3e.html 因为想使用phpdocument生成文档,不得不安装pear ...
- Iocomp控件教程之Analog Display—模拟显示控件(优于EDIT控件)
Analog Display是简洁的显示控件.用于显示指定准确度和单位的模拟值(实数),能够将准确度设置为0.使显示结果为整数. 第一步:建立MFC对话框 第二步:插入AnalogDisplay控件 ...
- 样条之EHMT插值函数
核心代码: ////////////////////////////////////////////////////////////////////// // 埃特金插值 ////////////// ...
- Ubuntu sh命令无法正确执行 (修改默认sh为bash)
新安装的ubuntu,执行shell命令,都怀疑自己的shell水平了. 原来, ubuntu默认的是dash, 需要手动执行命令将dash改为bash. 命令: sudo dpkg-reconfig ...
- Go语言之进阶篇mysql增 删 改 查
一.mysql操作基本语法 1.创建名称nulige的数据库 CREATE DATABASE nulige DEFAULT CHARSET utf8 COLLATE utf8_general_ci; ...
- 【Spark】SparkStreaming-提交到集群运行
SparkStreaming-提交到集群运行 spark streaming 提交_百度搜索 SparkStreaming示例在集群中运行 - CSDN博客
- 【应用】R--判断类别型属性之间是否有相关性(相互之间是否独立)
检验某学区所有在售房源中,小区与楼栋类别(低层:多层;小高层:高层)是否相关 导入数据: > house<- read.table("house_data.txt", ...