Java:使用 Java 开发的一个异常处理框架
背景
这篇文章介绍的异常处理思路不错,本文试图给出一种具体实现,当然可能和作者的思路有所不同。
框架地址:https://github.com/happyframework/HappyFramework。
框架介绍
关于异常的一些想法:
- 异常不能跨越“边界类”。
- 在边界类之下,异步不能被“吞掉”。
- 系统在不同场景或分层中,需要的不同的处理“策略”。
- 每种策略都是一个可扩展的“管道”。
- 可以和 AOP 进行集成。
- 异常可以用来给业务用户提供“提醒”。
- 异常可以给运维用户提供“日志”。
我希望异常处理框架以某种机制支持上面的各种想法。
针对边界类的处理场景
模拟的边界类
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 的成员的主要意图是:
- Throwable getException():返回正在处理的异常。
- void setNewException(final Throwable newException):替换或包装异常的时候调用此方法。
- boolean isExceptionHandled():异常是否被处理过。
- void setExceptionHandled(final boolean exceptionHandled):吞掉异常的时候调用此方法。
- 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 开发的一个异常处理框架的更多相关文章
- 在做java 的web开发,为什么要使用框架
现在做项目都会使用框架,现在很常见的框架就是SSH(Struts+SpringMVC+spring+hibernate),SSM(Struts/springMVC+Spring+Hibernate), ...
- java前后端开发需掌握的框架及技术
一.Java开发 1.J2EE架构及主流框架,spring4.spring boot.spring MVC.spring Security.spring cloud.struct2.hibernate ...
- 基于Spring开发的一个BIO-RPC框架(对新人很友好)
PART1:先来整体看下项目的构成 其中bio-rpc-core就是所谓的rpc框架 bio-rpc-example-client即所谓的服务调用方(你的项目中想要调用服务的地方) bio-rpc-e ...
- 关于JAVA项目中的常用的异常处理情况总结
1. JAVA异常处理 在面向过程式的编程语言中,我们可以通过返回值来确定方法是否正常执行.比如在一个c语言编写的程序中,如果方法正确的执行则返回1.错误则返回0.在vb或delphi开发的应用程序中 ...
- 俯瞰 Java 服务端开发
原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...
- 从头实现一个koa框架
koajs是最流行的nodejs后端框架之一,有很多网站都使用koa进行开发,同时社区也涌现出了一大批基于koa封装的企业级框架.然而,在这些亮眼的成绩背后,作为核心引擎的koa代码库本身,却非常的精 ...
- 深入探索 高效的Java异常处理框架
转载自:http://www.sunwei.org/archives/196 摘要:本文从Java异常最基本的概念.语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对比Sprin ...
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- java web后台开发SSM框架(Spring+SpringMVC+MyBaitis)搭建与优化
一.ssm框架搭建 1.1创建项目 新建项目后规划好各层的包. 1.2导入包 搭建SSM框架所需包百度云链接:http://pan.baidu.com/s/1cvKjL0 1.3整合spring与my ...
随机推荐
- HDU 1686 Oulipo(KMP变形求子串出现数目(可重))
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 题目大意:给两个字符串A,B求出A中出现了几次B(计算重复部分). 解题思路:稍微对kmp()函 ...
- SVN文件上感叹号、加号、问号等图标的原因
黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别 ...
- GO基本数据结构练习:数组,切片,映射
按<GO IN ACTION>的书上进行. 应该是第二次了哦~~ package main import ( "fmt" ) func main() { array : ...
- Hadoop案例(六)小文件处理(自定义InputFormat)
小文件处理(自定义InputFormat) 1.需求分析 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案.将多个小文件合并 ...
- Loadrunner报错“Too many local variablesAction.c”解决方法
问题描述,在Action.c里定义数组时如果数组长度过长,如char a[1024*1024]运行时即会报错: 意思为:太多的局部变量 问题原因及解决方法如下: 1. VuGen对于局部变量可以分配的 ...
- MySQL几个特别语法示例
简单介绍MySQL中几种特殊语法的用法: 1.创建示例用表和数据: 创建employees表[注:与SQL Server示例数据库Northwind中的表employees相同的表结构]: CREAT ...
- windbg调试相关命令
windbg 查找函数:x exe!main* 条件断点打印字符:bp 7199a2b0 ".printf \"message:%ma\", poi(@esp+8);.e ...
- HDU 6199gems gems gems (DP)
gems gems gems Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- Contains,Exists,Any,Count 比较是否存在某个元素
private static void Main(string[] args) { ; Console.WriteLine("判断是否存在某个元素 :"); Console.Wri ...
- 初识Linux 基础操作
Linux常用指令: 在Linux中如果不懂基础命令,在Linux中将寸步难行,下面是我在初学Linux系统时总结的一些基本命令. 1.基础命令 ls ...