zoukankan      html  css  js  c++  java
  • 第六十一条:抛出与抽象相对应的异常

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    七层协议&网络配置
    解决跨域问题
    拖拽 ‘vue-grid-layout’ 插件了解下
    详解vuex
    在腾讯出差的日子
    对象的解构赋值应用
    MQTT项目请求设置
    五分钟搞定Go.js
    Chrome使用video无法正常播放MP4视频的解决方案
    微信小程序地图开发总结
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4545978.html
Copyright © 2011-2022 走看看