背景

这篇文章介绍的异常处理思路不错,本文试图给出一种具体实现,当然可能和作者的思路有所不同。

框架地址:https://github.com/happyframework/HappyFramework

框架介绍

关于异常的一些想法:

  1. 异常不能跨越“边界类”。
  2. 在边界类之下,异步不能被“吞掉”。
  3. 系统在不同场景或分层中,需要的不同的处理“策略”。
  4. 每种策略都是一个可扩展的“管道”。
  5. 可以和 AOP 进行集成。
  6. 异常可以用来给业务用户提供“提醒”。
  7. 异常可以给运维用户提供“日志”。

我希望异常处理框架以某种机制支持上面的各种想法。

针对边界类的处理场景

模拟的边界类

 package com.happyframework.exception.handling;

 import org.springframework.stereotype.Controller;

 import com.happyframework.exception.handling.springframework.HandleException;

 @Controller
public class TestController { @HandleException("UI")
public void test() {
throw new RuntimeException("业务失败");
} }

因为边界类需要特殊的异常处理策略,这里指定了的策略名字为:“UI”。

“UI”策略对应的管道配置

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd"> <context:component-scan base-package="com.happyframework.exception.handling.springframework" />
<context:component-scan base-package="com.happyframework.exception.handling" /> <aop:aspectj-autoproxy/> <bean class="com.happyframework.exception.handling.springframework.ExceptionHandlerDefination">
<property name="policy" value="UI"/>
<property name="handler">
<bean class="com.happyframework.exception.handling.ConsoleLoggingHandler"/>
</property>
</bean>
<bean class="com.happyframework.exception.handling.springframework.ExceptionHandlerDefination">
<property name="policy" value="UI"/>
<property name="handler">
<bean class="com.happyframework.exception.handling.ConsoleNotificationHandler"/>
</property>
</bean>
</beans>

为管道定义了两个处理器:日志处理器和提醒处理器,因为是测试的处理器,实现就比较简单,真实项目中可以决定:哪些异常需要日志?哪些信息提醒给用户?

运行输出

 记录日志:java.lang.RuntimeException: 业务失败
提示消息:java.lang.RuntimeException: 业务失败

“UI”策略导致异常被吞掉了,这也是我们期望的行为,后面会介绍如何在处理器中吞掉异常。

核心 API 介绍

主要类型

代码可以去 https://github.com/happyframework/HappyFramework 下载。

重点说一下 ExceptionHandlerChain

 package com.happyframework.exception.handling;

 public interface ExceptionHandlerChain {

     Throwable getException();

     void setNewException(final Throwable newException);

     boolean isExceptionHandled();

     void setExceptionHandled(final boolean exceptionHandled);

     void proceed();

 }

ExceptionHandlerChain 是作为参数传递给 ExceptionHandler:

 package com.happyframework.exception.handling;

 public interface ExceptionHandler {

     void handle(final ExceptionHandlerChain chain);

 }

ExceptionHandlerChain 的成员的主要意图是:

  1. Throwable getException():返回正在处理的异常。
  2. void setNewException(final Throwable newException):替换或包装异常的时候调用此方法。
  3. boolean isExceptionHandled():异常是否被处理过。
  4. void setExceptionHandled(final boolean exceptionHandled):吞掉异常的时候调用此方法。
  5. void proceed():执行下一个处理器。

一个简单的异常处理器

 1 package com.happyframework.exception.handling;
2
3 final class ConsoleNotificationHandler implements ExceptionHandler {
4
5 @Override
6 public final void handle(final ExceptionHandlerChain chain) {
7 System.out.println("提示消息:" + chain.getException());
8
9 chain.setExceptionHandled(true);
10 chain.proceed();
11 }
12
13 }

备注

第一次用 Java 写东西,感觉挺不错的。

Java:使用 Java 开发的一个异常处理框架的更多相关文章

  1. 在做java 的web开发,为什么要使用框架

    现在做项目都会使用框架,现在很常见的框架就是SSH(Struts+SpringMVC+spring+hibernate),SSM(Struts/springMVC+Spring+Hibernate), ...

  2. java前后端开发需掌握的框架及技术

    一.Java开发 1.J2EE架构及主流框架,spring4.spring boot.spring MVC.spring Security.spring cloud.struct2.hibernate ...

  3. 基于Spring开发的一个BIO-RPC框架(对新人很友好)

    PART1:先来整体看下项目的构成 其中bio-rpc-core就是所谓的rpc框架 bio-rpc-example-client即所谓的服务调用方(你的项目中想要调用服务的地方) bio-rpc-e ...

  4. 关于JAVA项目中的常用的异常处理情况总结

    1. JAVA异常处理 在面向过程式的编程语言中,我们可以通过返回值来确定方法是否正常执行.比如在一个c语言编写的程序中,如果方法正确的执行则返回1.错误则返回0.在vb或delphi开发的应用程序中 ...

  5. 俯瞰 Java 服务端开发

    原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...

  6. 从头实现一个koa框架

    koajs是最流行的nodejs后端框架之一,有很多网站都使用koa进行开发,同时社区也涌现出了一大批基于koa封装的企业级框架.然而,在这些亮眼的成绩背后,作为核心引擎的koa代码库本身,却非常的精 ...

  7. 深入探索 高效的Java异常处理框架

    转载自:http://www.sunwei.org/archives/196 摘要:本文从Java异常最基本的概念.语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对比Sprin ...

  8. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  9. java web后台开发SSM框架(Spring+SpringMVC+MyBaitis)搭建与优化

    一.ssm框架搭建 1.1创建项目 新建项目后规划好各层的包. 1.2导入包 搭建SSM框架所需包百度云链接:http://pan.baidu.com/s/1cvKjL0 1.3整合spring与my ...

随机推荐

  1. css如何将div画成三角形

    首先了解一下盒模型: 盒模型 先看一段代码: #div1{ height: 100px; border-style: solid; border-width: 100px 100px 100px 10 ...

  2. day6 time和datetime模块

        time模块 time模块提供各种操作时间的函数 #1.时间戳    1970年1月1日之后的秒 #2.元组 包含了:年.日.星期等... time.struct_time #3.格式化的字符 ...

  3. DotNetOpenAuth实践系列

    写在前面 本人在研究DotNetOpenAuth的过程中,遇到很多问题,很多坑,花费了很多时间才调通这玩意,现在毫无保留的分享出来,希望博友们可以轻松的上手DotNetOpenAuth,减少爬坑时间. ...

  4. Deepin 2015 安装惠普打印机驱动

    参考:https://bbs.deepin.org/forum.php?mod=viewthread&tid=34749&extra= 1.安装新立得包管理器:sudo apt-get ...

  5. nodejs读取文件时相对路径的正确写法(使用fs模块)

    在开发nodejs中,我们往往需要读取文件或者写入文件,最常用的模块就是fs核心模块.一个最简单的写入文件的代码如下(暂时不考虑回调函数): fs.readFile("./test.txt& ...

  6. Java经典设计模式之五大创建型模式

    转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...

  7. ubuntu下让进程在后台运行

    (1)输入命令: nohup 你的shell命令 & (2)回车,使终端回到shell命令行: (3)使用第二第三条,完全屏蔽掉信号 用disown -h jobspec来使某个作业忽略HUP ...

  8. 洛谷P2296 寻找道路 [拓扑排序,最短路]

    题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  9. 堆优化Dijkstra计算最短路+路径计数

    今天考试的时候遇到了一道题需要路径计数,然而蒟蒻从来没有做过,所以在考场上真的一脸懵逼.然后出题人NaVi_Awson说明天考试还会卡SPFA,吓得我赶紧又来学一波堆优化的Dijkstra(之前只会S ...

  10. 【数据结构】Trie树

    数据结构--Trie树 概念 Trie树,又称字典树.前缀树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计 ...