`

谈谈异常处理与web应用中的异常体系结构设计(一)

阅读更多



我想,每一个java开发人员都知道通过 try/catch/finally来进行异常处理,但是你有没有和我一样,在某个时候觉得异常处理是如此的让人沮丧,将原本清晰的代码和逻辑折腾的面目全非的感觉呢?最让我深刻感受到这一点的是用jdbc的时候,当我看着写出来的代码,我很疑惑的想,我不是在写业务逻辑,我是在给异常处理当牛做马!!!


不管那一本讲授编程语言的书籍中,不管是c++的,java的,还是与他们完全不同的语言,如erlang,都会有一章专门讲异常处理,并且我们被告知异常处理是程序不可缺少的一部分,是写出健壮程序必须的。虽然书中给出的例子看起来异常处理并不难,语法,语义都没有什么难以理解的地方。但是当我们真正靠自己的双脚来丈量地球的时候,我们会发现,原来异常处理和我们如影随行,并且很多时候我们在被异常群殴。虽然我们很恼火,但是却好像毫无办法。我们很难在重重异常的包围中,让自己像一个虔诚的教徒一样,保持自己的绅士风度,保持优雅的举止。虽然这个时候你可能具备了一定的经验,也深深的阅读了比如java 核心编程,java编程思想,更进一步,你还对于模式有着一定的掌握,但是异常就像空气一样,时刻环绕着你。
我也是如此,所以才有这篇文章,我想把自己的想法和更多的人交流,分享,并且希望通过这些努力能有一些效果。所以,这篇文章不是一个解决方案,只是一些想法,欢迎各位拍砖。

一.为什么异常会这么深的破坏我们代码的优雅性,让我们很疲惫。

因为我们的代码可能会出现多种不同的异常,这些异常都需要被处理。


因为这个原因,我们的代码往往会是下面这样的。


try{
statementblock;
}
catch(ExceptionType1 e)
{
try{
statementblock
}
catch(ExceptionType4 e)
{

}

}
catch(ExceptionType2 e)
{
e.printStackTrace();
throw new UserDefinedException;
}
catch(ExceptionType3 e)
{
e.printStackTrace();
throw new UserDefinedException;

}
finally
{

}

现在有很多的公司已经开始采用持续集成环境了,我们的代码的圈复杂度在这种情况下肯定让人头痛。所以,能够以一种统一的,简洁的方式来完成异常处理对于我们的工作有着很重要的意义。接下来,我给出我在实际工作中采用的方法。由于我们给公司打工,所以我们的工作成果是公司的,版权也是公司的,这里我贴出的代码是一个示意性的,把意思表达到即可,欢迎拍砖。


先说一下要满足的要求:

(1)这个处理方式必须满足使用上的方便性

(2)必须不丢失异常栈信息

(3)要满足异常消息/异常码准确表达异常位置的要求

(4)要能够方便的记录日志

(5) 多层调用不发生覆盖或着重复捕获


我们的项目里头自己定义了一个异常类作为应用自己的异常,暂且称为ApplicationException吧,但是很遗憾,这个类定义的很差劲,不接受将异常作为参数传入。于是修改之,目的是记录异常栈的信息。同时,建立一个ExcetpionUtil类,其中有一个 transtoApplicationException地方法,


public static ApplicationException transtoApplicationException(String errorMsg, class<T> clazz,Exception e)
{
if(isApplicationException(e))//判断该异常是否是已 //经经过捕获处理的
{
throw e;
}
else
{

Logger.getLog(clazz.getName()).

error(getStackTrace(e))//将异常栈输出到日志
throw new ApplicationException(errorMsg,e); //抛出转换后的异常
}
}
上面的代码还有很多问题,但是,它也具备了一些好的特性。它的使用场景是应用自身之定义了一种异常,当应用的异常有多重的时候,需要通过父类判断是否被捕获过。但是,他至少可以并且也做到了让异常分支在代码中保持很少量的要求,并且,对于每一个应用中的方法都可以正确无误的个给出一个异常码或者消息而绝对不会被覆盖或者受到干扰,不管中间经过了多少层调用。

 

 

 有人看,但是没有人回复和拍砖,不管,第一次发文章,继续坚持吧。


  昨天没写完,今天继续。目前给出的这个把那个不是一个异常体系设计的结果,而是直接面向解决问题而而得来的一个工具类,使用了这个以后,代码就会变成下面这个样子



      try{

               statementBlock;

           }

             catch(Exception)

            {

            throw   transtoApplicationException(errorMsg,e,className.class,e);

            }

 

前面提到过:对于每一个方法,这个做法可以保证方法和异常码/消息之间的唯一对应关系,这对于代码调试是有利的,因为异常报告的很准确,再加上异常栈的信息,足够了。而且,也满足了异常在最近的地方被捕获的要求。以后,你的代码中再也不需要e.printStacktrace(),不需要那么多的异常分支,不需要在调试完成后再关掉 e.printStacktrace()。


但是,这个工具虽然有用,却不支持在发生异常时释放资源的工作,也不支持不同的底层异常抛出为不同的应用自定义异常

的场景。这就需要进一步的改进。后面,会继续深入讨论关于异常处理的问题。   

 

0
1
分享到:
评论

相关推荐

    谈谈Web设计中的黄金分割

    在Web设计领域,黄金分割是一种广泛应用的美学原则,它源自古希腊数学,具有强烈的视觉吸引力和平衡感。本文将深入探讨黄金分割在Web设计中的应用,以及如何利用这个概念来提升网页的用户体验和视觉效果。 黄金分割...

    计算机体系结构讲义 原理

    计算机体系结构是信息技术领域的核心概念,它涉及到计算机硬件和软件之间的接口设计,是理解计算机工作原理的关键。本讲义深入浅出地探讨了这一主题,特别关注了乘法器(Multiplier)和算术逻辑单元(ALU)这两个...

    范浩强_wc2012谈谈各种数据结构

    3. 乱序数据的处理:故事中提到鹦鹉到达的顺序是随机的,这意味着在实际应用中,数据结构需要有处理乱序数据的能力。作者提出了一种编码方法,使得每个鹦鹉不仅能记住数字,还能记住自己的位置信息,解决了乱序到达...

    web网页设计

    首先,让我们谈谈web网页设计的基础。网页设计的核心在于HTML(超文本标记语言)和CSS(层叠样式表)。HTML是网站内容的骨架,用于定义页面结构,如标题、段落、图像和链接等元素。CSS则负责页面的外观和布局,包括...

    谈谈Web3D技术在现代教学中的应用.pdf

    这种技术在各种学科中都有广泛的应用,比如在建筑学中,学生可以通过Web3D技术参观虚拟建筑,甚至查看其内部结构,或者在模拟建造过程中亲身体验。这样的学习方式不仅更具吸引力,还能解决实际教学中时间、空间限制...

    PHP中的错误处理、异常处理机制分析

    异常处理是另一种更结构化、更可控的错误处理方式,它允许程序在遇到错误时抛出一个异常对象,然后通过try-catch块来捕获并处理这个异常。示例如下: ```php try { if (!file_exists('test.txt')) { throw new ...

    Web权限菜单栏的应用与展示

    总结来说,Web权限菜单栏的应用与展示是一个涉及用户接口设计、权限管理策略和数据库设计的综合问题。有效的权限菜单栏设计能提升系统的安全性,优化用户体验,而数据库则为权限管理提供了可靠的数据支持。理解并...

    软件体系结构模式ppt课件.ppt

    软件体系结构模式描述了一个出现在特定设计语境中的特殊的再现设计问题,并为它的解决方案提供了一个被证明良好的一般计划。这种模式总结了在软件开发中现存的、被证明良好的经验,再用来促进好的设计实践。 二、...

    MIS的结构化系统设计

    静态数据结构设计,通过建立数据结构模型来定义数据关系;以及系统平台的设计,考虑系统运行所需的软硬件配置,确保平台的开放性。总体设计的核心是从全局实体联系图(ERD)中导出优化的关系模型,从数据流图(DFD)...

    aspnet webapi源码

    在ASP.NET MVC4中,Web API是内置的一部分,为开发人员提供了一种统一的方式来处理Web应用和API的开发。WebStack则是微软开源项目中的一个集合,包括了ASP.NET Web API、ASP.NET MVC以及其他相关的Web开发库。 首先...

    java算法设计应用程序设计

    在IT领域,算法设计与应用程序设计是至关重要的组成部分,特别是在Java这样的高级编程语言中。本文将深入探讨这两个主题,以及它们如何相互关联并应用于实际的软件开发中。 首先,我们来理解“Java算法设计”。算法...

    WebApi和访问WebApi两个项目

    WebApi和访问WebApi是开发过程中常见的两个概念,它们在构建分布式系统和提供网络服务时起着关键作用。本文将深入探讨这两个项目及其关联技术,包括WebApi的使用和通过HttpWebRequest类进行WebApi调用。 WebApi是...

    本文介绍堪称Web数据库黄金组合的PHPMySQL如何构筑一个网络数据库应用的方法

    接下来,我们谈谈MySQL,这是一个关系型数据库管理系统(RDBMS),以其高性能、高可靠性以及开源特性而闻名。MySQL被广泛应用于各种规模的Web应用,从小型个人博客到大型电子商务平台。它支持SQL标准,提供了丰富的...

    web2.0 网页设计师必备手册+教程

    作为一位Web2.0网页设计师,你需要掌握一系列关键技能和知识,以创造出吸引用户并具有良好用户体验的设计。本篇文章将深入探讨网页设计师所需掌握的要点,包括设计理论、布局技巧、CSS和DIV的应用,以及相关的教程...

    WEB设计的常用函数

    这里我们将深入探讨一些常用的WEB设计函数,主要关注ASP.NET中的函数以及与数据处理相关的函数。 首先,ASP.NET是微软开发的一个用于构建Web应用程序的框架,它提供了丰富的内置函数和类库,使得开发者能够高效地...

    [WEB应用防火墙]谈谈安卓的 Intent 注入.zip

    Intent是Android系统中一个至关重要的组件,它是应用程序之间、应用程序与系统服务之间进行交互的桥梁。Intent注入则是针对Android系统的一种安全攻击手段,通过恶意篡改或插入Intent对象,攻击者可以控制应用流程,...

    谈谈关于哈夫曼树及其应用

    首先从哈夫曼树的定义和构造算法出发,详细阐述了如何构建哈夫曼树,并重点探讨了哈夫曼树在不同场景下的三种典型应用:用于最佳判定过程的设计、在通讯及数据传送中的二进制编码,以及在排序问题中的运用。...

    Struts+数据结构

    Struts和数据结构是两个非常重要的IT领域概念,它们在构建高效、可维护的Web应用程序中发挥着关键作用。Struts是一种基于MVC(模型-视图-控制器)设计模式的Java Web框架,用于简化开发复杂的Web应用。而数据结构则...

    本专生WEB网站SSH框架毕业设计学生选课系统实现

    综上所述,这个学生选课系统项目涵盖了Web开发中的多个关键领域,包括前端交互、后端逻辑处理、数据库设计以及安全性考虑,对于学习和实践全栈开发能力具有很高的价值。通过这个项目,学生不仅可以深入理解SSH框架的...

    高焕堂android应用软件架构设计

    在Android应用开发中,架构设计是至关重要的一个环节,它决定了软件的质量、可维护性以及扩展性。"高焕堂Android应用软件架构设计"可能涵盖了关于如何构建高效、可复用且易于理解的Android应用程序的深入知识。高...

Global site tag (gtag.js) - Google Analytics