打字猴:1.700448685e+09
1700448685
1700448686 list.add(e);
1700448687
1700448688 }
1700448689
1700448690 //第二个逻辑片段
1700448691
1700448692 try{
1700448693
1700448694 //Do Something
1700448695
1700448696 }catch(Exception e){
1700448697
1700448698 list.add(e);
1700448699
1700448700 }
1700448701
1700448702 //检查是否有必要抛出异常
1700448703
1700448704 if(list.size()>0){
1700448705
1700448706 throw new MyException(list);
1700448707
1700448708 }
1700448709
1700448710 }
1700448711
1700448712 这样一来,doStuff方法的调用者就可以一次获得多个异常了,也能够为用户提供完整的例外情况说明。可能有读者会问:这种情况可能出现吗?怎么会要求一个方法抛出多个异常呢?
1700448713
1700448714 绝对可能出现,例如Web界面注册时,展现层依次把User对象传递到逻辑层,Register方法需要对各个Field进行校验并注册,例如用户名不能重复,密码必须符合密码策略等,不要出现用户第一次提交时系统提示“用户名重复”,在用户修改用户名再次提交后,系统又提示“密码长度少于6位”的情况,这种操作模式下的用户体验非常糟糕,最好的解决办法就是封装异常,建立异常容器,一次性地对User对象进行校验,然后返回所有的异常。
1700448715
1700448716
1700448717
1700448718
1700448719 编写高质量代码:改善Java程序的151个建议 [:1700438185]
1700448720 编写高质量代码:改善Java程序的151个建议 建议111:采用异常链传递异常
1700448721
1700448722 设计模式中有一个模式叫做责任链模式(Chain of Responsibility),它的目的是将多个对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止,异常的传递处理也应该采用责任链模式。
1700448723
1700448724 上一个建议中我们提出了异常需要封转,但仅仅封转还是不够的,还需要传递异常。我们知道,一个系统友好性的标志是用户对该系统的“粘性”,粘性越高,系统越友好,粘性越低系统友好性越差,那问题是怎么提高系统的“粘性”呢?友好的界面和功能是一个方面,另外一方面就是系统出现非预期情况时的处理方式了。
1700448725
1700448726 比如,我们的JEE项目一般都有三层结构:持久层、逻辑层、展现层,持久层负责与数据库交互,逻辑层负责业务逻辑的实现,展现层负责UI数据的处理。有这样一个模块:用户第一次访问的时候,需要持久层从user.xml中读取信息,如果该文件不存在则提示用户创建之,那问题来了:如果我们直接把持久层的异常FileNotFoundException抛弃掉,逻辑层根本无从得知发生了何事,也就不能为展现层提供一个友好的处理结果了,最终倒霉的就是展现层:没有办法提供异常信息,只能告诉用户说“出错了,我也不知道出什么错了”—毫无友好性可言。
1700448727
1700448728 正确的做法是先封装,然后传递,过程如下:
1700448729
1700448730 (1)把FileNotFoundException封装为MyException。
1700448731
1700448732 (2)抛出到逻辑层,逻辑层根据异常代码(或者自定义的异常类型)确定后续处理逻辑,然后抛出到展现层。
1700448733
1700448734 (3)展现层自行决定要展现什么,如果是管理员则可以展现低层级的异常,如果是普通用户则展示封装后的异常。
[ 上一页 ]  [ :1.700448685e+09 ]  [ 下一页 ]