之前做的一个项目中,有一些对异常处理的封装,如果抛出的异常是项目特定的异常,则直接抛出。如果不是,则进行一个封装。
现在的做法是这样的:
catch (InputValidationFault ive) {
throw new InputValidationFault(ive.getMessage(), "");
} catch (InputLimitFault ile) {
throw new InputLimitFault(ile.getMessage(), "");
} catch (SystemUnavailableFault suf) {
throw new SystemUnavailableFault(suf.getMessage(), "");
} catch (Exception e) {
throw new SystemUnavailableFault(e.getMessage(), "");
}
整个项目中掺杂了大量类似的代码,因为需要确保项目特定的异常不会被转化成System Unavailable Fault,因此不得不在之前首先把它们都catch住并重新抛出去。
这里有点奇怪的,为什么要重新new一个异常抛出呢? 应该是该开发人员对于Java技术的不熟练,以至于写出这样的代码。 其实可以改良成这样一个版本:
catch (InputValidationFault ive) {
throw ive;
}
这样对项目中的senior developer造成了很大的负担,需要不时的review其他人的代码,确保没有错误。
一直在想是否能够对这段代码进行封装,会减少很多犯错的机会,也减轻开发人员的负担。
今天看Tomcat源码,发现了一个不错的做法,将之前的代码稍微改了下,应该可以解决这个问题:
catch (Throwable t) {
handleThrowable(t);
}
...
public static void handleThrowable(Throwable t) throws InputValidationFault,
InputLimitFault, SystemUnavailableFault{
if (t instanceof InputValidationFault) {
throw (InputValidationFault) t;
} else if (t instanceof InputLimitFault) {
throw (InputLimitFault) t;
} else if (t instanceof SystemUnavailableFault) {
throw (SystemUnavailableFault) t;
} else {
throw new SystemUnavailableFault(t.getMessage(), "");
}
}
分享到:
相关推荐
C.LRU既反映了历史性,又反映了程序访问的局部性,命中率较接近OPT,是实际应用最广泛的一种替换算法。 D.OPT是最优替换算法,是实际应用最广泛的一种替换算法。 26、在页面替换中,如果选择近期最少访问的页面作为...
<br/> <br/>Python是一种即译式的,互动的,面向对象的编程语言,它包含了模组式的操作,异常处理,动态资料形态,十分高层次的动态资料结构,以及类别的使用。Python揉合了简单的语法和强大的功能。它的...
保持数据库和对象视图的一致性是非常重要的工作,OpenJPA 支持三种模式处理数据库和对象视图的一致性:正向映射(Forward Mapping)、反向映射(Reverse Mapping)、中间匹配(Meet-in-the-Middle Mapping),并且为...
以前的数据库管理系统为上述各类操作提供单独的语言,而SQL将全部任务统一在一种语言中。 3.是所有关系数据库的公共语言 由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS转到另一...
一种情况是因为DWR1.0的解析器中有个Bug,在有些场合会无法处理返回值的类型.所以应该要避免这种情况的发生. 一种情况是因为解析器是一个语法宽松的解析器,他不象编译器一样对语法有非常严格的要求,所有有时可能一些...
虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中...
ODBC(Open Database Connectivity)是一种开放标准的应用程序接口(API),用于在应用程序和不同的数据库管理系统之间进行交互。通过 ODBC 驱动程序,开发者可以编写一次性的应用程序代码来访问任何支持 ODBC 的...
对于交换机来说,任何一种业务都要分别在模拟话机、ISDN话机、V5话机、多种形式的话务台上做测试。对于中继的业务,则要充分考虑各种信令:TUP、ISUP、PRA、NO1、V5等等。 【案例1.2.2】 对某交换类进行计费测试,...
我们的目标在于确立一种简单的标准体系,它可以使任何有经验的牌手之间不用商讨便可采用,而且,用起来十分简明,各种叫牌只赋予一确定的含意,不得有其它解释(例如:对1NT开叫,应叫2H是转移,不得用以表示红心...
面向对象的程序设计(Object-Oriented Programming, OOP)是一种编程范式,其核心思想是将数据和对数据的操作封装在一起,形成一个整体——对象。这种封装有助于隐藏对象内部的具体实现细节,使得对象之间的交互变得...
- **解析:** 实现多线程的一种常见方法是让一个类实现`Runnable`接口并重写`run()`方法,然后创建`Thread`对象并将`Runnable`实例传递给构造函数。最后,通过调用`Thread`对象的`start()`方法来启动线程。 ### 十...
1. **冒泡排序**:冒泡排序是一种简单的排序算法,通过重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,直到没有再需要交换,算法结束。 2. **字符串反转算法**:字符串反转可以...
之道 》,其中很多观点我看了很受启发,以前我也将"设计模式" 看成一个简单的解决方案,没有从一种高度来看待"设计模式"在软 件中地位,下面是我自己的一些想法: 建筑和软件某些地方是可以来比喻的 特别是中国传统建筑...
- 另一种更为高效且系统的方法是创建一个过滤器SetCharacterEncodingFilter,并在web.xml中配置它。这个过滤器会自动将请求的字符编码设置为UTF-8,从而避免了每次手动设置编码的麻烦。以下是具体的实现步骤: - ...
所以首先采用第一种思路。 这里就需要写percmserver,白手起家,如何开始?还是需要循序渐进,首先从最简单的开始。后期,可以将这个服务器设计成多用户的(那就是另一个话题),首先需要把网络的机制引入进来,并...
以前的数据库管理系统为上述各类操作提供单独的语言,而SQL将全部任务统一在一种语言中。 3.是所有关系数据库的公共语言 由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS转到另一...
一般来说,代购行为被视为一种特殊的销售行为,需要按规定计税。 4. **关于企业所属机构间移送货物征收增值税的问题**:企业内部不同机构之间互相移送货物时,除非有特殊情况,否则一般视为内部调拨,不视为销售...
正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇,或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”。 好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质,只有充分...
正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇,或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”。 好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质,只有充分...