您好、欢迎来到现金彩票网!
当前位置:ds视讯 > 非受查异常 >

Guava]Throwables:简化异常和错误的传播与检查

发布时间:2019-09-04 02:36 来源:未知 编辑:admin

  所有这些方法都会自己决定是否要抛出异常,但也能直接抛出方法返回的结果——例如,

  通常来说,如果调用者想让异常传播到栈顶,他不需要写任何 catch 代码块。因为他不打算从异常中恢复,他可能就不应该记录异常,或者有其他的动作。他可能是想做一些清理工作,但通常来说,无论操作是否成功,清理工作都要进行,所以清理工作可能会放在 finallly 代码块中。但有时候,捕获异常然后再抛出也是有用的:也许调用者想要在异常传播之前统计失败的次数,或者有条件地传播异常。

  当只对一种异常进行捕获和再抛出时,代码可能还是简单明了的。但当多种异常需要处理时,却可能变得一团糟:

  非 Java7 用户却受困于这个问题。他们想要写如下代码来统计所有异常,但是编译器不允许他们抛出 Throwable(译者注:这种写法把原本是 Erro r或 RuntimeException 类型的异常修改成了 Throwable,因此调用者不得不修改方法签名):

  总之,Throwables.propagate的这种用法也就马马虎虎,在 Java7 中就没必要这样做了。在其他 Java 版本中,它可以减少少量的代码重复,但简单地提取方法进行重构也能做到这一点。此外,使用 propagate 会意外地包装受检异常。

  原则上,非受检异常代表 bug,而受检异常表示不可控的问题。但在实际运用中,即使 JDK 也有所误用——如 Object.clone()、Integer. parseInt(String)、URI(String)——或者至少对某些方法来说,没有让每个人都信服的答案,如 URI.create(String)的异常声明。

  有时候,调用者会使用Throwables.propagate转化异常。这样做有没有什么缺点?最主要的恐怕是代码的含义不太明显。throw Throwables.propagate(ioException)做了什么?throw new RuntimeException(ioException)做了什么?这两者做了同样的事情,但后者的意思更简单直接。前者却引起了疑问:它做了什么?它并不只是把异常包装进RuntimeException吧?如果它真的只做了包装,为什么还非得要写个方法?。应该承认,这些问题部分是因为propagate的语义太模糊了(用来抛出未声明的异常吗?)。也许wrapIfChecked更能清楚地表达含义。但即使方法叫做wrapIfChecked,用它来包装一个已知类型的受检异常也没什么优点。甚至会有其他缺点:也许比起RuntimeException,还有更合适的类型——如IllegalArgumentException。 我们有时也会看到propagate被用于传播可能为受检的异常,结果是代码相比以前会稍微简短点,但也稍微有点不清晰:

  然而,我们似乎故意忽略了把检查型异常转化为非检查型异常的合理性。在某些场景中,这无疑是正确的做法,但更多时候它被用于避免处理受检异常。这让我们的话题变成了争论受检异常是不是坏主意了,我不想对此多做叙述。但可以这样说,Throwables.propagate 不是为了鼓励开发者忽略 IOException 这样的异常。

  但是,如果你要实现不允许抛出异常的方法呢?有时候你需要把异常包装在非受检异常内。这种做法挺好,但我们再次强调,没必要用 propagate 方法做这种简单的包装。实际上,手动包装可能更好:如果你手动包装了所有异常(而不仅仅是受检异常),那你就可以在另一端解包所有异常,并处理极少数特殊场景。此外,你可能还想把异常包装成特定的类型,而不是像 propagate 这样统一包装成 RuntimeException。

  可能是受检异常,见上文”争议一:把检查型异常转化为非检查型异常”。但如果我们确定 future 对应的任务不会抛出受检异常呢?(可能 future 表示 runnable 任务的结果——译者注:如

  。尤其对于 Future,请考虑 Futures.get 方法。(TODO:对 future.get()抛出的另一个异常

  。(实际上这不大可能,但你想直接重新抛出 cause 的话,编译器会强迫你考虑这种可能性)见上文”用法二:把抛出 Throwable 改为抛出 Exception”。

  的 cause 可能是非受检异常。如果是这样的话,cause 会直接被

  抛出。不幸的是,cause 的堆栈信息反映的是异常最初产生的线程,而不是传播异常的线程。通常来说,最好在异常链中同时包含这两个线程的堆栈信息,就像

  所做的那样。(这个问题并不单单和 propagate 方法相关;所有在其他线程中重新抛出异常的代码都需要考虑这点)

  Guava 提供了如下三个有用的方法,让研究异常的原因链变得稍微简便了,这三个方法的签名是不言自明的:

  1.作用可以简洁的完成参数检验,在进行业务逻辑代码前进行前置判断。并且避免了冗长的if语句。guava将所有检验的API都放置于Preconditions类中。2.api介绍Preconditions...博文来自:Donny的博客

  程序中访问大量静态数据,并且并发量很高,这个时候使用GuavaCache来做缓存管理,能大大提高服务效率,内存占用率问题。当时当时在使用过程中发现有数据丢失的问题;程序初始化加载表中数据根据查询条件作...博文来自:的博客

  why?在编写程序的时候,很多时候都需要检查输入的参数是否符合我们的需要,比如人的年龄要大于0,小于100,值不能为NUll如果不符合这两个要求,我们将认为这个对象是不合法的.检测是非常有必要的,不检...博文来自:汪小哥

  有时候,当我们我们捕获异常,并且像把这个异常传递到下一个try/catch块中。Guava提供了一个异常处理工具类,可以简单地捕获和重新抛出多个异常。importjava.io.IOException...博文来自:Darker

  有时候,当我们我们捕获异常,并且像把这个异常传递到下一个try/catch块中。Guava提供了一个异常处理工具类,可以简单地捕获和重新抛出多个异常。例如: importjava.io.IOExcep...博文来自:azhegps的博客

  本课程主要介绍PLSQL语言,他是Oracle数据库开发必须要掌握的内容。

  guava的前置检查1.用处比自己写判断简单2.方法明确,大家都用的话.利于代码风格统一,增加代码可读性3.静态导入这些方法,直接用即可4.不符合直接抛异常importstaticcom.google...博文来自:idealemail的博客

  书上说g定义的异常分为不检查异常和检查异常。如果方法可以产生这些异常却无法对其进行处理,就必须在该方法的throws列表中列出。那其他的包下的异常呢?例如java.io下的异常呢?谢谢各位指教。论坛

  任何人都不敢说自己的代码没有bug,所以程序抛异常是再经常不过的事情,有时候,你会想把捕获的exception抛到上一个try/catch块。对于RuntimeException和Error尤为如此,...博文来自:Alan_Mathison_Turing的博客

  Guava类库中的Throwables提供了一些异常处理的静态方法,这些方法的从功能上分为两类,一类是帮你抛出异常,另外一类是帮你处理异常。也许你会想:为什么要帮我们处理异常呢?我们自己不会抛出异常吗...博文来自:Learning

  转载:有时候,当我们我们捕获异常,并且像把这个异常传递到下一个try/catch块中。Guav...博文来自:weixin_42868638的博客

  有时候,你会想把捕获到的异常再次抛出。这种情况通常发生在Error或RuntimeException被捕获的时候,你没想捕获它们,但是声明捕获Throwable和Exception的时候,也包括了了E...博文来自:Ying

  今天看了廖雪峰老师的一篇文章关于处理异常的,写的很不错,总结一下!我们都知道JS里面的函数是非常重要的一部分,也是学习JS的精髓所在,那函数分为很多种,看你怎么分,可以分为有参函数和无参函数,按照返回...博文来自:A_Struggling_Hacker

  现在看到很多开源框架的异常都是封装好的,比如struts,spring,都把Exception给封装成runtime exception,请教的问题是,rn我怎么才能得到原来抛出的异常,比如一个异常时数据库异常SQLException,封装之后呢,就变成了HibernateDataAccessException,那能不能得到原来的异常信息,比如SQLException的信息,这个我想如果能获得的话,也应该是要运行时才能获得的吧,如果不能,为什么?论坛

  Guava为我们提供了一个非常方便并且实用的异常处理工具类:Throwables类。这个类的API可以参见:博文来自:weixin_34356138的博客

  今晚看了关于PL/SQL异常传播的内容,做个笔记。1.PL/SQL执行语句块发生运行时错误PL/SQL语句块的可执行部分发生某个运行时错误,执行权会转到该语句块的异常处理部分。当与该异常相关的语句执行...博文来自:weixin_30379531的博客

  java检查异常和非检查异常异常类的继承关系检查异常和非检查异常并没有进行特定异常的分流Throwable、Exception都是检查异常。非检查异常只有RuntimeException及其子类。...博文来自:chris00012的博客

  检查异常与运行时异常(非检查异常)的区别检查异常和非检查异常的类检查异常是Exception的本身或者子类例如:IOException(输入输出异常)、FileNotFoundException(文件...博文来自:洪晓鸿

  已检查异常,指的是一个函数的代码逻辑没有错误,但程序运行时会因为IO等错误导致异常,你在编写程序阶段是预料不到的。如果不处理这些异常,程序将来肯定会出错。所以编译器会提示你要去捕获并处理这种可能发生的...博文来自:tianyuxingxuan的博客

  先来概念:Exception异常分为:RuntimeException(运行时异常,也叫未检查异常或不受检查异常)和已检查异常(或受检查异常): 已检查异常是指程序员已经足够小心的检查了他的代...博文来自:第三帝国

  时间序列:事情的发展具有连续性,只要赖以发生的条件不发生质的变化,事物在未来的基本发展趋势任然会延续下去时间序列常用的算法移动平均(mvmovingaverage)指数平滑(esexponetials...博文来自:nextbox

  异常的传播,我们分为以下两部分:1、异常的触发链2、异常处理的最佳实践 一、异常的触发链先一句话总结一下:从触发的节点开始传播(包含当前触发节点)首先,照例我们有一个用户代码:publicfinalc...博文来自:翻身咸鱼的博客

  受检查异常都是应该处理的异常吗,比如IOException,SQLException,好像也没办法处理啊,也就是在catch里打印出错误信息以便查错吧。而且catch后程序还继续运行,这个要必要吗,因为有异常后运行的结果没用吧,我们一般都要重新运行程序吧论坛

  欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。 java运行时异常是可能在java虚拟机正常工作时抛出的异常。...博文来自:朱小厮的博客

  问题引入在数据层各个模块之间的调用,比如A调用B,而B需要去拿C的数据做一些逻辑判断,如果C的数据为空就会报出空指针异常,那么问题来了,B“拿”到C数据需不需要做数据检查?一种回答是:既然都知道空指针...博文来自:SPARK的专栏

  Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。它有两个子类:Error和Exception,分别表示错误和异常。其中异常Exception分为运...博文来自:赶路人儿

  1.运行时异常不用捕获就可以编译通过,当发生异常时,会把异常一直往上抛,最终到JVM,由JVM进行处理2.检查异常编译时必须进行捕获或者往上抛到调用他的方法,不然编译不通过3.运行异常出现时线程终止或...博文来自:小白的博客

  breakout_alex:博主,合并小文件过程中有遇到过比较严重的问题吗?

http://kamexpress.net/feishouchayichang/1163.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有