关于业务方法抛出异常的问题

07-11-05 frogoo
最近做的一个项目中

看到了一些这样的接口

public RetMsg queryMonthlyList(String mobileno, int theYear, int theMonth, int type) throws BOSSDataPackageException,ExceedMaxBOSSConnectionException, BranchNotFoundException,IOException, ListNotFoundException ;

抛出的异常其中一部分是自定义的异常.如果实现类或者实现类的子类需要向上抛出其他异常的话就没法处理了 只能用try了.为什么不直接这样写?

public RetMsg queryMonthlyList(String mobileno, int theYear, int theMonth, int type) throws Exception

方法中抛出子异常的话 也一样可以捕捉到

朋友说:

"作为接口层,应该是不需要查看代码就可以调用开发,如果只是抛出Exception,调用接口的开发人员根本不可能知道具体的异常类型是什么。可以看看相关的开源框架或者JDK src。我想应该没有任何一个地方是直接抛出Exception的。"

一开始我觉得好象有些道理..不过琢磨了下,觉得还是欠妥,开源框架和JDK 都是作为一种工具来使用,代码相对来说很稳定,抛出的异常也有针对性,但是一个业务接口的实现很难判断其中会出现的异常,如此将接口抛出异常的类型限定总觉得不合适.

我觉得一些业务接口和工具类的接口应该遵循不同的规则吧?

frogoo
2007-11-06 08:52
up 一下

banq
2007-11-06 11:33
>,但是一个业务接口的实现很难判断其中会出现的异常,如此将接口抛出异常的类型限定总觉得不合适.

基本同意你的看法,你看到的接口代码应该算比较粗糙的。太多抛出让接口反而失去其简洁声明的目的。

frogoo
2007-11-06 12:06
谢谢你的回复...

wlmouse
2007-11-07 14:47
这个属于接口设计的问题。首先来说,Exception是绝对不能用的。虽然这样一来,所有的异常都可以抛了,但是同样的,你也不知道异常的具体问题了。异常信息都被简化掉了。

一般通常的做法是自定义一个异常或运行时异常。比如Spring就把所有持久层的异常封装成DaoException了。你需要定义一个你自己的持久层或业务层异常。然后当异常发生的时候:

catch (异常) {

异常处理。。。

throw new 自定义异常(异常);

}

这样就可以了,即简化了接口,也保留了异常信息

windflaw
2007-11-07 18:12

[该贴被windflaw于2007-11-07 18:20修改过]

猜你喜欢