背景

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

框架地址: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. HTML 禁止显示input默认提示信息

    看问题 html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  2. python中list的底层实现

    这里不讨论具体的实现细节,主要是转载这篇文章: 顺序表的原理与python中的list类型. 原文就不贴过来了,总结一下: 确定数据类型的意义在于确定一个数据在内存中占据的空间大小以及如何解释一段内存 ...

  3. 百度NLP面试题

    C++ :     1.拷贝构造函数和重载=符分别在什么情况下被调用,实现有什么区别 2.虚函数的目的,虚函数和模板类的区别,如何找到虚函数 常规算法: 1. 如何输出一个集合的所有真子集,递归和非递 ...

  4. 04 java 基础:数据类型

    java 数据类型:基本类型与引用类型 基本类型:数值型,其中数值型分为整型.浮点型,整型包括 byte.short .int.long ,默认为 int 类型.浮点类型分为单精度.双精度,分为 fl ...

  5. 【C#】缓存数据

    namespace WpfCopy.Controls { public class CacheFileEventArgs : EventArgs { public bool IsFaulted { g ...

  6. 转:Linux创建进程

    转:http://www.cnblogs.com/GT_Andy/archive/2011/06/21/2086129.html 我们都知道,进程就是正在执行的程序.而在Linux中,可以使用一个进程 ...

  7. 如何对富文本编辑器(FCK Html Editor)的工具栏进行扩展?

    我们在项目开发过程中,会经常使用到富文本编辑器.GeneXus内置的富文本编辑器FCK Html Editor使用起来非常方便,只要将页面变量的控件类型(Control Type)选择为FCK Htm ...

  8. 洛谷——P2683 小岛

    P2683 小岛 题目背景 西伯利亚北部的寒地,坐落着由 N 个小岛组成的岛屿群,我们把这些小岛依次编号为 1 到 N . 题目描述 起初,岛屿之间没有任何的航线.后来随着交通的发展,逐渐出现了一些连 ...

  9. Xcode_7_GM_seed.dmg下载

    Xcode_7_GM_seed.dmg下载     Xcode_7_GM_seed.dmg  免费下载链接: http://pan.baidu.com/s/1pJ7oGAZ 密码: y5bx

  10. Appium robotframework-appium (ios 客户端测试)环境搭建

    一. 简介 1.1摘要 本人测试新人,最近在搞ios客户端的自动化,准备采用robotframework-appium来实现自动化测试,一边学习一边总结,此安装说明文档是基于mac系统10.11版本, ...