转载请注明原文地址: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. 识骨寻踪第一季/全集Bones迅雷下载

    第一季 Bones Season 1 (2005)看点:这是一部专门从“骨头”上寻找破案线索的刑侦剧.女博士布莱南绰号“骨头”(艾米丽·丹斯切尔 Emily Deschanel 饰),是个学识渊博.专 ...

  2. 使用DDMS中的内存监测工具Heap来优化内存

    最近在做一个照片墙的应用,涉及到很多知识,其中难点在于如何应对数量庞大的图片,这就涉及到内存管理的知识了.今天介绍的工具是DDMS中自带的Heap,它可以显示出当前引用占用的内存,剩余的内存等信息.下 ...

  3. 《Web性能权威指南》

    <Web性能权威指南> 基本信息 原书名:High performance browser networking 原出版社: O'Reilly Media 作者: (加)Ilya Grig ...

  4. C#多线程读写同一文件处理

    在多线程访问读写同一个文件时,经常遇到异常:“文件正在由另一进程使用,因此该进程无法访问此文件”. 多线程访问统一资源的异常, 解决方案1,保证读写操作单线程执行,可以使用lock 解决方案2,使用S ...

  5. Eclipse 乱码 解决方案总结(UTF8 -- GBK)

    UTF8 --> GBK;   GBK --> UTF8 eclipse的中文乱码问题,一般不外乎是由操作系统平台编码的不一致导致,如Linux中默认的中文字体编码问UTF8, 而Wind ...

  6. 基于Otsu算法的图像自适应阈值切割

    在图像处理实践中,将灰度图转化为二值图是非经常见的一种预处理手段. 在Matlab中,能够使用函数BW = im2bw(I, level)来将一幅灰度图 I.转化为二值图. 当中.參数level是一个 ...

  7. 修改visual studio2010 的快捷键,使用ctrl+W 关闭当前文档

    废话不多说,打开visualstudio 的菜单 [工具]->[选项].定位到 环境->键盘. 找到光口.关闭文档窗口.把默认的ctrl+F4移除,因为这两个组合键按起来太麻烦,太累了.再 ...

  8. fasttext介绍和试用

    http://fasttext.apachecn.org/cn/docs/v0.1.0/support.html fasttext介绍网站 https://github.com/facebookres ...

  9. Asp.net web Control Enable 属性设置

    最近手上有一个很简单的一个小项目,需要查看编辑的历史记录,先前设计的时候把数据都save 到DB了,现在时间紧迫 就不在画新的UI,而是采用以前的edit页面 来显示数据,这里就需要把页面上所有的co ...

  10. MySQL集群的几种方案

    组建MySQL集群的几种方案LVS+Keepalived+MySQL(有脑裂问题?但似乎很多人推荐这个)DRBD+Heartbeat+MySQL(有一台机器空余?Heartbeat切换时间较长?有脑裂 ...