转载请注明原文地址: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拦截并处理异常的更多相关文章

  1. 设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。

    设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”,则抛出一个异常信息“This is a XYZ”,如果从命令行输入 ABC,则没有抛出异常.(只有 ...

  2. java基础之自定义异常类及throw和throws的区别

    一.异常的架构: Throwable类:所以异常类都是Throwable的子类,它派生两个子类 Error和Exception. Error类:表示仅靠程序本身无法恢复的的严重错误,比如内存溢出,虚拟 ...

  3. 类ExampleA继承Exception,类ExampleB继承ExampleA。 有如下代码片断:

    try { throw new ExampleB("b") } catch(ExampleA e){ System.out.println("ExampleA" ...

  4. 类Exception_A继承Exception,类Exception_B继承Exception_A,请问执行此段代码的输出是什么?

    @Test public void Test_Exception() { try { throw new ExceptionB("A"); } catch (ExceptionA ...

  5. javaweb利用filter拦截请求

    项目上有个小需求,要限制访问者的IP,屏蔽未授权的登录请求.该场景使用过滤器来做再合适不过了. SecurityFilter.java: package com.lichmama.webdemo.fi ...

  6. javaweb利用filter拦截未授权请求

    项目上有个小需求,要限制访问者的IP,屏蔽未授权的请求.该场景使用过滤器来做再合适不过了. SecurityFilter.java: public class SecurityFilter imple ...

  7. Java自定义异常类

    用户可以根据自己的需要定义自己的异常类,定义异常类只需要继承Exception类即可 //================================================= // Fi ...

  8. Java -- 异常的捕获及处理 -- 自定义异常类

    7.4 自定义异常类 定义异常类只需要继承Exception类即可. 例:自定义异常类 Class : MyException package limeThrowable._7_4; public c ...

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

    Java中的异常处理:何时抛出异常,何时捕获异常? 2017-06-07 1 异常分类 Throwable对象可以分为两组: 一组是unchecked异常,异常处理机制往往不用于这组异常,包括: Er ...

随机推荐

  1. 侏罗纪世界2百度云在线观看迅雷下载高清BT下载

    原名:Jurassic World: Fallen Kingdom 地区:美国 语言:英语 首播:2018-06-15(中国大陆) / 2018-06-22(美国) 电视台: 类型:动作 / 科幻 / ...

  2. 手游开发Android平台周边工具介绍

    1.渠道接入 主要是需要接入各平台的登录.充值接口,各家SDK又不统一,Android渠道都是鱼龙混杂,就算小渠道你看不上,但量多了,加起来也还可观,所以大家都拿出吃奶的尽去铺渠道.国内几大主要的An ...

  3. Java SPI机制原理和使用场景

    SPI的全名为Service Provider Interface.这个是针对厂商或者插件的.一般来说对于未知的实现或者对扩展开放的系统,通常会把一些东西抽象出来,抽象的各个模块,往往有很多不同的实现 ...

  4. 在ubuntu中搜索文件或文件夹的方法

    版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/dcrmg/article/details/78000961 1. whereis+文件名 用于程序名的搜索 ...

  5. 【ContestHunter】【弱省胡策】【Round8】

    平衡树维护凸壳/三角函数+递推+线段树 官方题解:http://pan.baidu.com/s/1sjQbY8H 洛阳城里春光好 题目大意:(其实出题人已经写的很简短了……直接copy的-_-.sor ...

  6. [转]应用RSACryptoServiceProvider类轻松实现RSA算法

    在我们现实当中经常会存在需要对某些数据进行加密保护 然后进行解密的操作,比方,我们需要对某些XML配置信息里面的某些数据进行加密,以防止任何人打开该XML配置信息都能正常的看到该配置信息里面的内容,从 ...

  7. jboss支持远程访问配置

    jboss有个特点,在本机启动之后,只能在本机的网页访问 http://localhost:8080,在其他机器上访问不了jboss服务. 1.关闭jboss服务端的防火墙 解决方法如下: (dcm4 ...

  8. go语言之进阶篇字符串转换

    1.字符串转换 示例: package main import ( "fmt" "strconv" ) func main() { //转换为字符串后追加到字节 ...

  9. 如何使用chrome自带的Javascript调试工具 【转】

    http://zhangyongbluesky.blog.163.com/blog/static/1831941620113155739840/ 将写好的Javascript代码用chrome打开. ...

  10. Restore IP Addresses leetcode java

    题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...