Java异常处理的良好实践

Java异常处理的良好实践,java,performance,exception,checked,unchecked,Java,Performance,Exception,Checked,Unchecked,我有一些关于Java中异常处理的问题。我读了一些关于它的文章,得到了一些相互矛盾的指导方针 让我们看一下上面提到的文章: 它指出,如果“客户机代码不能做任何事情”,通常应该避免使用检查异常。但这到底意味着什么?在GUI中显示错误消息是否足以引发已检查异常?但这将迫使GUI程序员记住捕获运行时异常及其后代以显示潜在的错误信息 本文提出的第二种观点是,除非我想在其中实现一些自定义字段/方法,否则应该避免发明自己的异常类。 我通常不同意这一点,我今天的实践正好相反:我将异常包装在自己的异常结构中,以

我有一些关于Java中异常处理的问题。我读了一些关于它的文章,得到了一些相互矛盾的指导方针

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

它指出,如果“客户机代码不能做任何事情”,通常应该避免使用检查异常。但这到底意味着什么?在GUI中显示错误消息是否足以引发已检查异常?但这将迫使GUI程序员记住捕获运行时异常及其后代以显示潜在的错误信息

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

我今天实现了一些代码,这是文章中介绍的“新方法”,在这里和那里抛出RuntimeException,然后让我分析它。更让我困惑的是,Sonar将我的RuntimeExceptions标记为主要错误,并给出了一条消息,如“避免抛出根类型异常,将它们包装在您自己的类型中”

所以这看起来很有争议,你怎么看

我还从今天的一位技术领先者那里听说,仅仅包装异常是不好的,“因为这对JVM来说是一个非常昂贵的操作”。另一方面,到处抛出SQLExceptions或IOExceptions看起来有点破坏封装

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

  • 什么时候用我自己的类型包装异常,什么时候不应该这样做?

  • 客户端对此无能为力,抛出 运行时异常?'

  • 性能问题如何?


  • 看起来像你的技术主管一样,因为他不擅长开发,所以经常逃避开发人员的角色

    我的建议是:

    • 与检查异常相比,更喜欢运行时异常,尤其是如果您不是API的唯一客户机。使用检查异常会强制每个客户端处理异常,即使它对此无能为力。如果这确实是您想要做的(即强制调用方处理它),那么选中的异常就是您想要的
    • 如果客户端在异常发生时唯一能做的事情是显示或多或少的一般性错误消息,例如“oops,发生了不好的事情,请重试或返回欢迎页面”,那么一定要使用运行时异常。大多数表示框架都提供了一种使用通用错误处理程序的方法
    • 一定要使用链接到抽象层的异常。从高级服务引发SQLException是不够的。在适当的情况下使用现有的异常类型(例如IllegalArgumentException来表示非法参数)。否则,将低级异常包装为更高级别的适当异常类型。代价是抛出异常。它是否包裹了另一个并不重要。无论如何,这只会在例外情况下发生

    不幸的是,根据常见问题解答,这对SO来说不是建设性的。你可能想试试programmers.stackexchange.com——也就是说,买Joshua Bloch的“高效Java”。任何认真对待Java的人都应该拥有一份拷贝。如果可以的话,我一定会将它迁移到Programmers.SE。有没有时间我们可以这样做?还是我一直在期待那一刻?这是一个很好的实践列表,但据我所知,包装要求重新抛出将“旧”异常作为构造函数参数传递给“新”异常。捕获并再次抛出异常的成本不是初始成本的200%吗?抛出异常的成本比
    if
    要高,但这并不是一个性能问题。与任何进程间调用或IO操作相比可以忽略不计。首先正确地执行,然后仅在必要时进行优化,并且如果您已经测量到这是性能问题的原因。不会的。一些指令的200%仍然是一些指令。