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


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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    Web性能压力测试工具之ApacheBench(ab)详解
    微服务监控之三:Prometheus + Grafana Spring Boot 应用可视化监控
    Sentinel-dashboard
    Java8之默认方法和静态接口方法
    蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别
    JAVA8 十大新特性详解
    Java链式方法 连贯接口(fluent interface)
    分布式计算概念一览
    Gradle学习
    Java堆外内存之七:JVM NativeMemoryTracking 分析堆外内存泄露
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4545978.html
Copyright © 2020-2023  润新知