Java中的OurCompanyRuntimeException类型有什么作用?

4
我现在所在的公司,在代码中有很多地方会抛出 OurCompanyRuntimeException(OurCompany是公司的实际名称)。据我所知,这个异常被描述为“由我们公司编写的代码抛出的运行时异常。”
我对Java还比较新,但我认为异常类型应该反映出出了什么问题,而不是谁的代码抛出了异常。例如,IllegalArgumentException表示某人向某个东西传递了非法参数。如果Sun编写的代码中传递了非法参数,你不会看到SunIllegalArgumentException,然后是IBMIllegalArgumentException——那样是愚蠢和毫无意义的,对吧?而如果你想知道异常是在哪里抛出的,你可以查看堆栈跟踪。我理解想要扩展RuntimeException(以便您不需要在所有地方都使用try/catch或“throws”),但为什么不创建说明发生了什么事情的子类,而不是说明它发生在哪家公司的代码中?
有人以前使用过 OurCompanyRuntimeException 的想法吗?或者有人知道他们为什么要这样做吗?

我以前见过这个。由于它更多是一种惯例而不是其他东西,在应用程序中并没有被广泛使用,因此对新手来说有点无用和误导。 - Antoine Claval
8个回答

6
听起来像是我在内部代码库中发现的通常定制代码的胡言乱语。我怀疑如果你询问,就会有一些命令使用OurCompanyRuntimeException,这基于某个高级人员的错误逻辑,没有人敢质疑,并且早已离开了——猴子、香蕉和软管的故事浮现在脑海中。
我同意你的看法,异常的名称应该表明发生的错误。

2

当阅读堆栈跟踪时,这肯定是有帮助的。也就是说,当扫描大量“由...引起”的行时,它有助于看到它发生在你抛出的东西中,而不是某个容器内部的东西。

还可以让您执行作为throwable的自定义操作 - 例如,在某个特殊日志中写入等。


2

是的,我也遇到了这个问题,但这个异常对我来说也没有意义。我的猜测是,公司在采用Java之后很早就编写了这些异常,却没有正确理解异常抛出和处理的工作原理(就像Nick已经说过的那样...由于高级程序员的存在,没有人敢质疑)。 如果公司感觉有必要创建自己的异常类(例如为了公司特定的日志记录目的),则不应直接抛出此异常(将其设置为抽象)。相反,我会派生具体的问题描述异常,或者只需遵循Spring框架的异常处理/抛出思路。


1

这是一个糟糕的概念。异常应该针对特定的用例。

好吧,如果公司确实生产了很多有缺陷的代码/产品,他们可能会将这种类型的异常作为广告 ;)


+1 对通过日志语句进行广告宣传的创意表示赞赏。 - Steve B.

1

你的公司可能正在向已有项目添加代码,比如开源代码库,并且只添加了很少的代码。因此,为了跟踪由公司开发人员引起的错误,他们认为应该有自己的异常类来区分之前存在的错误和扩展引起的错误。这样,他们可以仅关注由公司开发人员引起的错误,并可能要求原始源代码维护者修复其他错误。

随着时间的推移,当你们通过内部开发开发了足够大的代码库时,你们可以添加更多的异常并完全删除CompanynameRuntimeException。此外,他们可能会更加熟悉开发人员的专业水平,允许他们将所有错误视为一个,并不再怀疑由公司开发人员引起的错误。


1

将其作为特定异常的基类是非常合理的。您可以抛出特定的异常并捕获基类。

此外,它还可以允许携带原因(真正的异常)以及其他附加信息。这对于创建日志记录的诊断输出非常有用。


我检查了继承关系,OurCompanyRuntimeException有20多个子类,例如DeleteException、OurCompanySQLException和DatabaseTransactionException。因此,这可能是最初的意图,只是他们没有通过将基类设为抽象来强制执行它。我看到的大多数OurCompanyRuntimeException确实带有原因,这使得日志消息更加有用。 - Tyler
和你的老板沟通。将基类设为抽象类并修复所有产生的编译错误可能是一个下午的练习。 - Thorbjørn Ravn Andersen

1

看起来相当愚蠢,记录输出或堆栈跟踪将向您显示哪个类是有问题的,因此这种解释不可行。这也似乎很危险,因为如果人们被鼓励抛出OurCompanyRuntimeException,他们就会抛出RuntimeExceptions,这些异常不会强制调用者处理它们,并可能使您的应用程序崩溃。

我同意您的观点,即异常应反映其背后的原因。我曾经看到过一个自定义异常作为层次结构的根,尽管它可能应该是抽象的,以便您需要创建特定的扩展来使用它,并且它绝对不应该是RuntimeException。


我认为可能同时存在 OurCompanyRuntimeExceptionOurCompanyException - Tyler

0
在编程方面,拥有一个通用的公司级别异常类并不是一个坏主意,就像您所描述的那样,更具体的异常情况可以从中继承。已经有一个答案提到了特别捕获内部代码异常并忽略/通过核心Java或第三方库代码中的异常的能力。关键点在于更具体的异常应该从这个异常类中继承。很少需要抛出一个通用的公司命名的异常,并且几乎从来不建议这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接