• 第六十一条:抛出与抽象相对应的异常


    想想这样一种情况:方法B抛出了一个受检的异常 ,那么方法A在内部调用方法B时,面对方法B抛出的受检异常,可以选择继续抛出向上传播这个异常,

    也可以捕获这个异常进行处理。究竟是向上传播抛出,还是捕获处理呢???

    有一个指导原则是:抛出与抽象想对应的异常。

    例如如果方法B抛出了NoSuchElementException这个受检异常,然而在方法A中调用方法B时,根据方法A中的逻辑,当遇到NoSuchElementException

    异常时,抛出一个IndexsOutOfBoundsException异常更为合适。那么就不应该选择向上传播抛出NoSuchElementException,而是应该选择捕获NoSuchElementException,然后抛出IndexsOutOfBoundsException。

    更高层的实现应该捕获底层的异常,同时抛出可以按照高层抽象进行解释的异常。这种做法称为异常转译(exception translation)。

    一种特殊的异常转译形式称为异常链(exception chaining)。

    尽管异常转译让异常更加明确。但是如有可能,处理来自底层的异常的最好的做法是,在调用低层方法之前确保它们会成功执行,从而避免它们抛出异常。

    有时候,可以在给低层方法传递参数之前,检查更高层方法的参数的有效性,从而避免低层方法抛出异常。

    如果无法避免低层异常,次选方案是,让更高层的方法来悄悄地绕开这些异常(方法C调用方法A,那么方法C就是更高层的方法)。那么在高层方法中

    调用低层方法时,面对低层方法抛出的受检异常,高层异常可以捕获异常,转化为非受检异常,或者利用某种适当的记录机制(日志)将异常记录下来。

    这样更高层的方法C在调用高层方法A是,不用再受来自低层方法的异常烦扰,而异常在高层方法中也得到了处理。

  • 相关阅读:
    git clone失败
    矩阵相乘
    pandas中关于DataFrame 去除省略号
    Linux系统清除缓存
    Git 远程仓库 更新url
    看不到git远程分支
    c++
    undefined reference to symbol' pthread_create@@GLIBC_2.2.5'
    ssh 与远程机器保持心跳(linux)
    python 读取文件第一列 空格隔开的数据
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4545978.html
Copyright © 2020-2023  润新知