2

我想抛出一个具有特定名称的异常,并且这样的异常已经存在于侧包中。

例如UnexpectedExceptionjava.rmi. 我不使用 rmi packege 中的任何工具,但异常的名称正是我所需要的。

我可以在我自己的上下文中抛出该异常,也可以创建一个具有相同名称的新异常。哪种方式更好?

4

4 回答 4

6

仅仅因为名字是正确的并不意味着其他任何事情都是正确的。看描述,例如:

如果远程方法调用的客户端作为调用的结果接收到一个检查的异常,该检查的异常不在远程接口中方法的 throws 子句中声明的检查的异常类型中,则会引发 UnexpectedException。

这是否真的描述了您的异常试图代表什么?我怀疑不是。

想象一下你是一个客户——你会想知道为什么你必须捕捉(或声明)与 RMI 相关的东西,尽管你的代码库都与 RMI 无关。奇怪的东西会在整个代码中蔓延。伊克。

于 2013-03-13T15:53:30.807 回答
3

当您查看 Exception 的完全限定名称时,java.rmi是其名称的一部分。考虑一个程序员使用你的代码阅读来期待一个异常java.rmi,这可能会引起人们的注意,因此是一个坏主意。

特别考虑到这个例外:什么是意外的?您可以UnexpectedSomethingException改为命名您的班级,以便更清楚地了解正在发生的事情。

于 2013-03-13T15:54:09.903 回答
1

@Jon Skeet@akaIDIOT已经提供了很好的答案。我将添加几个与您的问题相关的示例:

java.rmi.UnexpectedException从与 RMI 无关的方法处理会很奇怪和令人困惑。

另请注意,异常的主要目的是允许客户端代码处理您自己无法处理的情况。因此,方法抛出的事实java.io.IOException意味着客户端代码应该负责处理意外的文件输入输出错误(重新检查文件访问/存在,基本设置)。方法抛出java.rmi.UnexpectedException提示客户端代码检查 RMI 设置

于 2013-03-13T15:57:53.553 回答
0

我强烈建议不要仅仅基于它共享您想要的名称这一事实重用另一个异常。例如,在 RMI 上下文之外抛出 java.rmi.UnexpectedException 会非常混乱。

我不确定您打算如何使用您的异常,但对我来说,仅基于名称,听起来您可以只使用 java.lang.RuntimeException,因为它具有相同的一般含义。

所以我的建议是这样的:

  1. 如果它确实是您的代码未准备好处理的意外预期异常,请使用 RuntimeException。如果您真的不需要 RuntimeException 已经提供的任何新功能,这是最合适的。
  2. 创建您自己的自定义 UnexpectedException 类。真的没有理由仅仅因为其他一些库已经使用它而严格避免使用某个类名。这是包的要点之一 - 提供命名空间来消除相同名称的歧义。使用现代 IDE,真的没有理由担心。其他人可能不同意——这是一个品味问题——但我个人认为这没有问题。当然没有技术上的理由不这样做。
于 2013-03-13T16:02:26.137 回答