Java:使用 Java 开发的一个异常处理框架
2024-08-25 23:20:34
背景
这篇文章介绍的异常处理思路不错,本文试图给出一种具体实现,当然可能和作者的思路有所不同。
框架地址: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 写东西,感觉挺不错的。
最新文章
- android MediaPlayer的一些使用方法简历
- 读书笔记_Effective_C++_条款四十八:了解模板元编程
- 【USACO】packrec
- cvsnt 设置用户、修改密码
- Dockerfile制作sshd镜像
- 2013长沙网络赛H题Hypersphere (蛋疼的题目 神似邀请赛A题)
- C语言_数字排列顺序
- JS数组Sort方法的使用
- linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例【转】
- mybits根据表自动生成 java类和mapper 文件
- vue项目sql图片动态路径引用问题
- EasyUI创建DataGrid及冻结列的两种方式
- 2019-03-05-day004-列表操作
- Flash:彻底理解crossdomain.xml、跨swf调用。
- Oracle体系结构之OFM管理
- Python CSV Reader/Writer 例子--转载
- idea中maven依赖不能下载的解决办法
- Sqler-Monitor
- InnoDB索引概述,二分查找法,平衡二叉树
- python 类继承
热门文章
- HTML表格的基本操作
- wondows下安装pytho&;pip
- python开发学习-day06(模块拾忆、面向对象)
- javascript copy text to clipboard
- ref:如何在大量jar包中搜索特定字符
- linux——(6)vim与vi
- 【转】全面了解Mysql中的事务
- FastReport.Net使用:[4]分组
- Ubuntu系统 安装谷歌 Chrome 浏览器
- [BZOJ4560][JLOI2016]字符串覆盖(贪心+DP)