基于jaxws的SOA的exception系统设计

呼呼ozZ 2009-06-04

这个是对jaxws上的fault的讨论。jaxws的webservice的自定义fault.

http://zhang-xzhi-xjtu.iteye.com/blog/372877

ws的异常设计

对jaxws的wsfault研究后发现,fault的定义比较怪,所以决定系统中所有的wsfault用一个统一的格式,即只定义一个WSFaultException,然后所有的ws都声明抛出这个WSFaultException。这样的优点是ws的异常比较统一,比较好处理。client端有可能是基于多个平台的,java,.net,client也比较好处理。

系统异常的设计

系统中的exception采用一个扁平的继承体系结构,都是继承于同一个MyException,所有逻辑层和dao层的exception都会转化会这个体系结构中的exception,然后抛出来。java的exception分为checked和unchecked,经过一番权衡,决定这个exception的体系是基于unchecked,这样在很多地方省下了无谓的声明,而且整个code看着比较干净。常用的ORM工具,如Hibernate,Ibatis,著名的spring都是用一个自成体系的uncheckedexception体系结构来表述异常。所以这个设计应该是可行的。定义好MyException,然后可以定义一些它的常用的子类,如ParaException,NotExistException等等。

异常的处理

对于系统中的异常的处理放在ws的边界处。定义一个interface叫做ExceptionHandler,里面只有一个api,就是对exception的处理。ws的边界处引入一个ExceptionHandler的实现类,这个类的实际功能是持有一个ExceptionHandler的列表,然后依次调用各个ExceptionHandler的方法处理exception,常用的ExceptionHandler可以预定义好供系统使用,比如ConvertHandler(转换各种Exception到WSFaultException),RethrowHandler(重新抛出exception)等等。这个一个典型的链式异常处理。异常处理链是通过xml文件来配置的,修改和扩展都比较方便。

异常的定义

明显的,MyException和MyException大部分的定义是一样的,主要有errorcode,errormsg,subsystemName,isClientException和detail。errorcode可以看作是一个比较强制的约定,这样防止了exception类型爆炸。isClientException表征了一个异常是由于client的操作错误造成的还是一个servererr。errormsg是一个可以定制化的errormsg,同一个类型的MyException可以根据异常的实际情况定制该信息。

小结:

1ws的异常统一简洁。

2系统的异常设计为一个unchecked异常的扁平体系,并且提供了一些常用的异常,server端编程时可以大量使用预定义异常。但是如果系统有特殊异常,可以方便的扩展,定义新的MyException的子类,然后使用。

3系统提供默认的异常处理链,大部分情况下系统使用该机制就可以了。如果要扩展,只需要定义新的ExceptionHandler,然后修改配置文件就行了。

4对于异常的log,倾向于在第一次知道该异常的时候打一个log,不重复打。可以在exception的定义中加一个字段用来控制打log,但是觉得这是如何处理exception的问题,在exception中加这个字段比较怪,所以不予采用。另一个方式是依靠程序规范。

相关推荐