当前位置: 首页 > 面试题库 >

Java异常处理的良好实践

充昌勋
2023-03-14
问题内容

我对处理Java中的异常有一些疑问。我读了一些,并得到了一些相互矛盾的指导方针。

异常处理的最佳实践

让我们看一下提到的文章:

它指出, 如果“客户端代码无法执行任何操作”,
通常应该避免使用检查的异常。但这到底是什么意思?在GUI中显示错误消息是否是冒充受检查的异常的充分原因?但这将迫使GUI程序员记住记住RuntimeException及其后代以显示潜在的错误信息。

本文提出的第二种观点是,除非我要在其中实现一些海关领域/方法,否则应该避免发明自己的异常类。我通常不同意这一点,我今天的实践恰恰相反:我将异常包装在自己的异常结构中,以反映我编写的类实现的反射目标,即使它们只是扩展了Exception而没有添加任何新方法。我认为这有助于在抛出时在更高的层中更灵活地处理它们,并且对于使用这些类的程序员来说,通常更清晰易懂。

今天,我实现了这篇文章中介绍的代码“新方法”中的一些“新方法”,然后在这里到处抛出RuntimeException,然后让Sonar对其进行分析。为了使我更加困惑,Sonar将诸如
“避免引发根类型异常,以自己的类型包装”之类 的消息标记我的RuntimeExceptions为重大错误

所以看起来很有争议,您怎么看?

我还从今天的一位技术负责人那里听说,仅包装异常是不好的,因为“这对于JVM来说确实是一项昂贵的操作”。对我来说,另一方面,到处都抛出SQLExceptions或IOExceptions似乎有点破坏封装。

那么您对我在这里提出的问题的一般态度是什么?

  1. 何时将异常包装在自己的类型中,何时不应该这样做?

  2. “客户端对此无能为力,抛出运行时异常”的 观点在哪里

  3. 那么性能问题呢?


问题答案:

看起来您的技术主管经常因为他不擅长而逃离了开发人员的角色。

我的建议是:

  • 与运行时异常相比,更喜欢运行时异常,特别是如果您不是API的唯一客户端时。使用已检查的异常会强制每个客户端处理该异常,即使它无法对此做任何事情。如果这确实是您想要执行的操作(即,强制调用者处理它),那么您想要的就是一个检查异常。
  • 如果客户端在发生异常时唯一能做的就是显示或多或少的通用错误消息,例如“哎呀,发生了不好的事情,请重试或返回到欢迎页面”,那么绝对可以使用运行时异常。大多数表示框架都提供了使用通用错误处理程序的方法。
  • 绝对使用链接到抽象层的异常。从高级服务中抛出SQLException是不够的。在适当时使用现有的异常类型(例如IllegalArgumentException表示非法参数)。否则,请将低级异常包装为较高级别的适当异常类型。代价高昂的是抛出异常。是否包装另一个都无关紧要。而且它无论如何都应该例外地发生。


 类似资料:
  • 主要内容:异常简介,异常类型很多事件并非总是按照人们自己设计意愿顺利发展的,经常出现这样那样的异常情况。例如: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回家。但天有不测风云,当你准备烧烤时候突然天降大雨,只能终止郊游提前回家。“天降大雨”是一种异常情况,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。 计算机程序的编写也需要考虑处理这些异常情况。 异常(exception)是在运行程序时产生的一种异

  • 我期望第1行捕获从第0行抛出的NullPointerException,但它没有发生。 但为什么呢?。 当定义了另一个catch块时,为什么第1行的NPE处理程序不能捕获它? 是因为“投掷”直接进入main()方法吗?

  • Java 的异常处理是 Java 语言的一大重要特性,也是提高代码健壮性的最强大方法之一。当我们编写了错误的代码时,编译器在编译期间可能会抛出异常,有时候即使编译正常,在运行代码的时候也可能会抛出异常。本小节我们将介绍什么是异常、Java 中异常类的架构、如何进行异常处理、如何自定义异常、什么是异常链、如何使用异常链等内容。 1. 什么是异常 异常就是程序上的错误,我们在编写程序的时候经常会产生错

  • 本文向大家介绍浅谈java异常处理(父子异常的处理),包括了浅谈java异常处理(父子异常的处理)的使用技巧和注意事项,需要的朋友参考一下 我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习《Thinking in Ja

  • 问题内容: 我正在尝试使用cx_Oracle连接到Oracle实例并执行一些DDL语句: 但是,我不确定在这里异常处理的最佳设计是什么。 首先,我在try块内创建对象,以捕获任何连接错误。 但是,如果无法连接,则不会再存在-这就是我在上面进行设置的原因。但是,这是好习惯吗? 理想情况下,我需要在连接时捕获错误,然后在运行DDL语句时捕获错误,依此类推。 嵌套异常是个好主意吗?还是有更好的方法来处理

  • 本文向大家介绍Java 中的异常处理?相关面试题,主要包含被问及Java 中的异常处理?时的应答技巧和注意事项,需要的朋友参考一下  Java异常类层次结构图 在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大