打字猴:1.700448725e+09
1700448725
1700448726 比如,我们的JEE项目一般都有三层结构:持久层、逻辑层、展现层,持久层负责与数据库交互,逻辑层负责业务逻辑的实现,展现层负责UI数据的处理。有这样一个模块:用户第一次访问的时候,需要持久层从user.xml中读取信息,如果该文件不存在则提示用户创建之,那问题来了:如果我们直接把持久层的异常FileNotFoundException抛弃掉,逻辑层根本无从得知发生了何事,也就不能为展现层提供一个友好的处理结果了,最终倒霉的就是展现层:没有办法提供异常信息,只能告诉用户说“出错了,我也不知道出什么错了”—毫无友好性可言。
1700448727
1700448728 正确的做法是先封装,然后传递,过程如下:
1700448729
1700448730 (1)把FileNotFoundException封装为MyException。
1700448731
1700448732 (2)抛出到逻辑层,逻辑层根据异常代码(或者自定义的异常类型)确定后续处理逻辑,然后抛出到展现层。
1700448733
1700448734 (3)展现层自行决定要展现什么,如果是管理员则可以展现低层级的异常,如果是普通用户则展示封装后的异常。
1700448735
1700448736 明白了异常为什么要传递,那接着的问题就是如何传递了。很简单,使用异常链进行异常的传递,我们以IOException为例来看看是如何传递的,代码如下:
1700448737
1700448738 public class IOException extends Exception{
1700448739
1700448740 //定义异常原因
1700448741
1700448742 public IOException(String message){
1700448743
1700448744 super(message);
1700448745
1700448746 }
1700448747
1700448748 //定义异常原因,并携带原始异常
1700448749
1700448750 public IOException(String message, Throwable cause){
1700448751
1700448752 super(message, cause);
1700448753
1700448754 }
1700448755
1700448756 //保留原始异常信息
1700448757
1700448758 public IOException(Throwable cause){
1700448759
1700448760 super(cause);
1700448761
1700448762 }
1700448763
1700448764 }
1700448765
1700448766 在IOException的构造函数中,上一个层级的异常可以通过异常链进行传递,链中传递异常的代码如下所示:
1700448767
1700448768 try{
1700448769
1700448770 //Do Something
1700448771
1700448772 }catch(Exception e){
1700448773
1700448774 throw new IOException(e);
[ 上一页 ]  [ :1.700448725e+09 ]  [ 下一页 ]