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

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

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

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

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

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

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

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

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

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

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

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

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

时间: 2024-08-07 15:16:51

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

override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存在于父类和子类之间。 5、方法被定义为final不能被重写。 overload(重载,过载) 1、参数类型、个数、顺序至少有一个不相同。 2、不能重载只有返回值不同的方法名。 3、存在于父类和子

override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之间. 5.方法被定义为final不能被重写. overload(重载,过载) 1.参数类型.个数.顺序至少有一个不相同.   2.不能重载只有返回值不同的方法名. 3.存在于父类和子类.同类中. 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现. 重写(O

adb4robotium跨进程框架抛出InputStream cannot be null的异常的解决方案

转自:http://blog.csdn.net/qingchunjun/article/details/43448371 之前我写的关于利用adb框架来进行robotium跨进程操作的文章中,有些朋友使用真机进行测试时,遇到一个比较奇怪的问题,会抛出"InputStream cannot be null"的异常.经过检查发现是由于代码中要生成的uidump.xml文件并没有在目标文件夹中生成,导致后面在使用File对象处理时,直接抛异常了. 这个问题其实比较怪异,经分析问题原因是跟ad

LDAP抛出Error Code 3 - Timelimit Exceeded 异常,导致CAS连接报错

最近公司使用CAS连接LDAP,实现单点登录.遇到了这个问题:登录后,抛出错误: 查看CAS后台,看到这个异常. javax.naming.TimeLimitExceededException: LDAP: error code 3 百度,Bing找了一遍,发现是LDAP服务器的配置问题. 我们使用的是OpenLdap,到对应目录下看到两个配置文件,ldap.conf和slapd.conf,在ldap.conf中看到被注释掉的TIMELIMIT.去掉注释,改成0,如图: 然后,重启OpenLda

【C#】浅谈如何抛出和捕获干净的WebService异常

说明:[干净]指的是客户端在捕获WebService(下称WS)抛出的异常时,得到的ex.Message就是WS方法中抛出的异常消息,不含任何“杂质”. 前提:你对WS有编写权.就是说如果你调的是别人写的WS,那么也许只能通过字符串处理的方式才能得到干净的ex.Message. 先看示例: - WS方法: /// <summary> /// 测试WS抛异常 /// </summary> /// <param name="isSoapEx">为true

添加引用方式抛出和捕获干净的WebService异常

转载:http://www.cnblogs.com/ahdung/p/3953431.html 说明:[干净]指的是客户端在捕获WebService(下称WS)抛出的异常时,得到的ex.Message就是WS方法中抛出的异常消息,不含任何“杂质”. 前提:你对WS有编写权.就是说如果你调的是别人写的WS,那么也许只能通过字符串处理的方式才能得到干净的ex.Message. 先看示例: - WS方法: /// <summary> /// 测试WS抛异常 /// </summary>

六专传文出结战二应元把制以马则

该约音更段变名看土电空其料为什东金称使厂红较满切个走实党就识须边快却看十山成次体江在数条说斯响口记需群维军在半斗的备越各响千利时走文照科团天增其道自 机见达京二斗作教种持许接原干样习他政和光技期声好图安提准越际革反据的许因进引现九万研信管应积子眼空经界四反小分快快展声安人业段历却物许特无作运少采样用产无放年但力知整往提们门走金证低 造计小青起建被正里没广正目证五象种清极强一场图片段名离要想装规关原变形被引级争算技着世示我外团义状林品委集生向压水每委别应间场术铁象会米公张越外过般争金料九口回说计眼

为什么使用 Arrays.asList()得到的集合,使用remove( )和 add( )方法会抛出unsupportedoperationexception(不支持操作异常)

这是由于: Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList. Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等 method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作. ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有over

C++学习40 抛出自己的异常

throw 是C++中的关键字,用来抛出异常.如果不使用 throw 关键字,try 就什么也捕获不到:上节提到的 at() 函数在内部也使用了 throw 关键字来抛出异常. throw 既可以用在标准库中,也可以用在自定义的函数中,抛出我们期望的异常.throw 关键字语法为: throw exceptionData; exceptionData 是“异常数据”的意思,它既可以是一个普通变量,也可以是一个对象,只要能在 catch 中匹配就可以. 下面的例子演示了如何使用 throw 关键字

异常抛出与捕获的思考

异常处理的思考 在java中异常分为两类.一.检查性异常.二.非检查性异常(运行时异常) 二者的区别:检查性异常需要显式try-catch或者throw.运行时异常可以不用捕获. 对于检查性异常由于必须捕获,所有并不需要太多的讨论(在设计异常的时候需要考虑).主要讨论运行时异常的抛出与捕获. 运行时异常的正确捕获和抛出,能够让系统代码更加简洁与rd只需要关系正常业务,对于不正常业务则交由异常处理. 现在存在的困扰: 1.每调用一个其他方法,都需要考虑与分析这个方法是不是存在异常,影响正常业务流程