在软件实现中,异常和日志都是重要的质量保证手段,常常,我们总是需要在系统实现上同时提供异常和日志,并且总是在“距离”很近的地方实现的,下面是一段典型的使用异常和日志的代码:
try{
//do something here...
}catch(Exception e){
log.error(“Your business exception message…”);
throw new BusinessException(“Your business exception message…”);
}
类似的代码我们经常遇到。虽然类似的代码都是简单的,但在现实中我们可以发现,一些时候粗心的程序员总是忽略或者忘记了两者都需要书写并且尽可能使用一致的异常消息。既然异常和日志总是同时出现的,那么我们就可以把两者集合起来。实际上在我看来,他们本来就是一家人。
为了达到异常和日志的集合,我测试过2种做法:一种选择是在自定义异常类中提供支持;一种是异常消息拼凑时提供支持。我们也可以在其中提供额外的功能来保证系统的效能,包括“适度”缓冲的异常处理。但需要特别注意的是,这种处理所带来的“长过程”(也就是经过不止一个步骤才完成这些功能)开销,在缓冲异常信息可能带来的系统出错时异常丢失,以及在异常消息处理时可能出现错误需要提供额外的保护措施。
更进一步的,我们应该注意到如下事实:
首先,异常的层次结构是不同的。它包括了底层的LowlevelException(合称相关需要抛出异常的异常处理)和上层的异常使用者,细心的读者应该发现,上述的实例实际上属于LowlevelException。
其次,我们也应该注意到异常包括客户定制的异常如BusinessException和Java自带的异常。这些异常的共存如何进行统一是我们需要面对的,但通常,我认为异常的客户定制包装是必要的,特别是多层结构下这个客户定制化就是让异常具有容易理解的信息。
异常和日志的集合,是一种简单、实用的创新做法,在这种实现里面,你可以提高系统异常处理的一致性程度、你可以提供经过缓冲的日志输出的一致性做法,我们也注意到她的处理的灵活性,必要时,你可以关闭她。
当然,无论如何,异常和日志的集合也好,分离也好,任何时候,人的因素才是最重要的,更一般的,我们可以发现,异常和日志要做的就是把系统特殊的或者重要的情况记录下来,这些记录信息应该具有明确的信息保证她是可读的、可定位的,实际上,这就是异常处理的全部。简单的说,“异常处理:实用就是好”(参考 http://www.matrix.org.cn/blog/X-Brave/《异常处理:实用就是好》)。
实际上,为了提高性能和保证系统的正确性,我很想使用异步消息机制来完成这些功能,或者至少我需要保证系统在 集群 环境下的正确性,但我拒绝使用复杂的第三方技术来实现这些要求(性能和依赖考虑),也不优先考虑使用高端服务器所自带的或者外购的消息服务组件,我也缺乏对 集群 环境的实际经验,这些现实妨碍了我对更好的实现的尝试。
但通过在系统中提供开关功能、对缓冲数据进行数目控制以及只在有限的几个或者一个地方提供具体实现,所以,对屏蔽该功能是容易的。当然,对至少两种实现的较高强度测试都是没有问题的。毕竟,真正的分布式的实现,特别是 集群 环境下的处理,并非如很多人宣称的那么容易实现。这种既满足了当前绝大部分需求(包括性能和可靠性)也充分考虑可能的影响并提供小开销解决方案的处理,我想,是足够了的。
当然,我还是很想听到您对如何自己实现简单的可靠异步消息以及集群实现技术细节的看法。欢迎讨论,当然,更多的,希望您是老师的角色并给予指导。异常处理:和日志集成
分享到:
相关推荐
springboot多模块项目,集成了mybatis,连接池,redis,日志,sql日志打印,异常统一处理,统一返回格式,mapper文件自动生成,generator xml ,切面日志和拦截器,sql注入过滤,解压即可部署打包启动,包含数据库...
使用前: 集成全局异常处理 DataException: 数据异常 特点是: 数据库的数据效验类的异常 (如: 数据不存在, 数据已存在, 数据缺失, 数据不合法) RemoteInvokeException: 远程调用异常 异常码: 被调用方异常码 或 ...
2、统一异常处理。 3、分页功能:aop实现默认分页赋值。 4、统一结果返回。 5、策略工厂模式:用于不同业务逻辑的实现。 6、uid生成工具。 7、集成swagger在线接口文档。 8、文件上传功能。 9、excel文件解析功能:...
项目概述:本项目是一个基于Python语言和Django框架的GraphQL集成解决方案,主要对Django中间件和异常处理进行了二次封装。项目共包含118个文件,涉及的主要编程语言为Python,同时包含HTML用于前端界面展示。文件...
EntLib的异常处理应用块(Exception Handling Application Block)是一个不错的异常处理框架,它使我们...我们可以采取日志记录、异常替换和封装这些常用的异常处理方式; 对于处理后的异常,如果异常处理策略规定需
异常处理:对可能出现异常的地方进行捕获并给出有意义的错误信息,避免程序崩溃。 RESTful API设计:按照资源导向原则设计API,明确HTTP方法的语义。 安全性:对用户输入进行校验和转义,防止SQL注入、XSS攻击等。...
Laravel 默认已经为我们配置好了错误和异常处理,我们在 App\Exceptions\Handler 类中触发异常并将响应返回给用户。 此外,Laravel 还集成了 Monolog 日志库以便提供各种功能强大的日志处理器,默认情况下,Laravel ...
为了有效,准确地集成网络性能,本文提出在综合自动巡逻中挖掘网络元素性能数据和网络元素日志信息,以检测网络异常。 因为日志文件具有大量数据和各种类型,并且日志数据具有复杂的结构并包含大量隐含信息。 通过...
该项目已成功集成执行器(监控),admin(可视化监控),logback(日志),aopLog(通过AOP记录web请求日志),统一异常处理( json级别和页面级别),freemarker(模板引擎),thymeleaf(模板引擎),Beetl(模板...
配置系统全局异常映射处理。定时任务和异步任务的使用方式。多个拦截器配置和使用场景。引入JdbcTemplate,和多数据源配置。集成Druid连接池,配置监控界面。集成Redis数据库,实现缓存管理。集成JPA持久层框架,简化...
• 根据svn,对源代码进行轻量级静态分析,获得代码中异常日志打印的原始信息• 收集单机/多机测试日志,并对日志文件进行parse、filter、merge等处理,得到实际覆盖的日志信息• 根据代码中的原始日志信息和实际...
Selenium框架 基于开源技术Selenium WebDriver、TestNG、Java、Apache POI的... 异常处理:使用Java try/Catch异常处理功能; 报告:生成自定义 html 报告并在 test-output 文件夹中可用; 接触 有关此示例项目的任
自动化套件 基于Selenium WebDriver、Appium、SoapUI、JMeter的一个简单的web、webservice、... 异常处理:使用Java try/Catch异常处理功能; 报告:生成自定义 html 报告并在测试输出文件夹中可用 浏览器操作动作写入
在网络安全领域,LogParser除了可以针对系统和网络各种活动日志进行智能分析,并可将日志数据集成到其他安全工具中进行全面跟踪,帮助用户迅速发现关键信息,进行引导式调查和日志分析,还能够预测和预防黑客攻击等...
Simon Luo * ... * ... * ...同时访问: ... * 进行单独的余票查询。... * 版权声明: 虽然这个软件不值钱,但是也请不要拿去改为商业版使用... * 这个版本还有很多细节性的东西没有处理:比如异常处理, 日志,状态栏的实现等。
开发人员只能专注于要实现的业务逻辑:通过允许将非功能性领域(例如日志记录,事务,异常处理等)的代码与业务功能开发领域分开,开发人员只能专注于业务逻辑。 通过依赖关系注入进行依赖关系处理:通过依赖关系...
Boot2基础:配置系统全局异常映射处理 04 Boot2基础:定时任务和异步任务的使用方式 05 Boot2基础:多个拦截器配置和使用场景 06 Boot2基础:引入JdbcTemplate,和多数据源配置 07 Boot2基础:集成Druid连接池,配置...
Splunk作为日志分析和事件管理工具,它可以帮助用户在海量数据中查找问题和异常事件。而ChartGPT是一种基于人工智能的可视化工具,它可以帮助用户自动生成高质量的图表和报告。将Splunk和ChartGPT集成起来,可以为...
该项目已成功集成 actuator(`监控`)、admin(`可视化监控`)、logback(`日志`)、aopLog(`通过AOP记录web请求日志`)、统一异常处理(`json级别和页面级别`)、freemarker(`模板引擎`)、thymeleaf(`模板引擎`)、Beetl(`...
麻雀虽小,五脏俱全,这是一个可直接用于生产的脚手架 ...在拦截器里统一处理异常 在拦截器里统一写操作日志 集成了kafka,但只写了生产者,消费者没写 集成了自己写的Socket工具类,业务耦合较重,可以自己改