热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java:使用Java开发的一个异常处理框架

背景这篇文章介绍的异常处理思路不错,本文试图给出一种具体实现,当然可能和作者的思路有所不同。框架地址:https:github.comhappyframeworkHappyFramew
背景

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

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

框架介绍

关于异常的一些想法:

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

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

针对边界类的处理场景

模拟的边界类

 1 package com.happyframework.exception.handling;
 2 
 3 import org.springframework.stereotype.Controller;
 4 
 5 import com.happyframework.exception.handling.springframework.HandleException;
 6 
 7 @Controller
 8 public class TestController {
 9 
10     @HandleException("UI")
11     public void test() {
12         throw new RuntimeException("业务失败");
13     }
14     
15 }

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

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

 1 xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:p="http://www.springframework.org/schema/p"
 5        xmlns:context="http://www.springframework.org/schema/context"
 6        xmlns:mvc="http://www.springframework.org/schema/mvc"
 7        xmlns:aop="http://www.springframework.org/schema/aop"
 8        xmlns:util="http://www.springframework.org/schema/util"
 9        xsi:schemaLocation="http://www.springframework.org/schema/beans 
10                            http://www.springframework.org/schema/beans/spring-beans.xsd
11                            http://www.springframework.org/schema/context 
12                            http://www.springframework.org/schema/context/spring-context.xsd
13                            http://www.springframework.org/schema/mvc
14                            http://www.springframework.org/schema/mvc/spring-mvc.xsd
15                            http://www.springframework.org/schema/aop
16                            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
17                            http://www.springframework.org/schema/util
18                             http://www.springframework.org/schema/util/spring-util-3.0.xsd">
19 
20     <context:component-scan base-package="com.happyframework.exception.handling.springframework" />
21     <context:component-scan base-package="com.happyframework.exception.handling" />
22     
23     <aop:aspectj-autoproxy/>
24 
25      <bean class="com.happyframework.exception.handling.springframework.ExceptionHandlerDefination">
26         <property name="policy" value="UI"/>
27         <property name="handler">
28             <bean class="com.happyframework.exception.handling.ConsoleLoggingHandler"/>
29         property>
30     bean>
31      <bean class="com.happyframework.exception.handling.springframework.ExceptionHandlerDefination">
32         <property name="policy" value="UI"/>
33         <property name="handler">
34             <bean class="com.happyframework.exception.handling.ConsoleNotificationHandler"/>
35         property>
36     bean>
37 beans>
38          

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

运行输出

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

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

核心 API 介绍

主要类型

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

重点说一下 ExceptionHandlerChain

 1 package com.happyframework.exception.handling;
 2 
 3 public interface ExceptionHandlerChain {
 4 
 5     Throwable getException();
 6 
 7     void setNewException(final Throwable newException);
 8 
 9     boolean isExceptionHandled();
10 
11     void setExceptionHandled(final boolean exceptionHandled);
12 
13     void proceed();
14 
15 }

ExceptionHandlerChain 是作为参数传递给 ExceptionHandler:

1 package com.happyframework.exception.handling;
2 
3 public interface ExceptionHandler {
4 
5     void handle(final ExceptionHandlerChain chain);
6 
7 }

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 写东西,感觉挺不错的。

 


推荐阅读
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • andr ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
author-avatar
mzyzzyk
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有