背景

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

框架地址: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 写东西,感觉挺不错的。

最新文章

  1. android MediaPlayer的一些使用方法简历
  2. 读书笔记_Effective_C++_条款四十八:了解模板元编程
  3. 【USACO】packrec
  4. cvsnt 设置用户、修改密码
  5. Dockerfile制作sshd镜像
  6. 2013长沙网络赛H题Hypersphere (蛋疼的题目 神似邀请赛A题)
  7. C语言_数字排列顺序
  8. JS数组Sort方法的使用
  9. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例【转】
  10. mybits根据表自动生成 java类和mapper 文件
  11. vue项目sql图片动态路径引用问题
  12. EasyUI创建DataGrid及冻结列的两种方式
  13. 2019-03-05-day004-列表操作
  14. Flash:彻底理解crossdomain.xml、跨swf调用。
  15. Oracle体系结构之OFM管理
  16. Python CSV Reader/Writer 例子--转载
  17. idea中maven依赖不能下载的解决办法
  18. Sqler-Monitor
  19. InnoDB索引概述,二分查找法,平衡二叉树
  20. python 类继承

热门文章

  1. HTML表格的基本操作
  2. wondows下安装pytho&amp;pip
  3. python开发学习-day06(模块拾忆、面向对象)
  4. javascript copy text to clipboard
  5. ref:如何在大量jar包中搜索特定字符
  6. linux——(6)vim与vi
  7. 【转】全面了解Mysql中的事务
  8. FastReport.Net使用:[4]分组
  9. Ubuntu系统 安装谷歌 Chrome 浏览器
  10. [BZOJ4560][JLOI2016]字符串覆盖(贪心+DP)