我想抛出一个具有特定名称的异常,并且这样的异常已经存在于侧包中。
例如UnexpectedException
在java.rmi
. 我不使用 rmi packege 中的任何工具,但异常的名称正是我所需要的。
我可以在我自己的上下文中抛出该异常,也可以创建一个具有相同名称的新异常。哪种方式更好?
我想抛出一个具有特定名称的异常,并且这样的异常已经存在于侧包中。
例如UnexpectedException
在java.rmi
. 我不使用 rmi packege 中的任何工具,但异常的名称正是我所需要的。
我可以在我自己的上下文中抛出该异常,也可以创建一个具有相同名称的新异常。哪种方式更好?
仅仅因为名字是正确的并不意味着其他任何事情都是正确的。看描述,例如:
如果远程方法调用的客户端作为调用的结果接收到一个检查的异常,该检查的异常不在远程接口中方法的 throws 子句中声明的检查的异常类型中,则会引发 UnexpectedException。
这是否真的描述了您的异常试图代表什么?我怀疑不是。
想象一下你是一个客户——你会想知道为什么你必须捕捉(或声明)与 RMI 相关的东西,尽管你的代码库都与 RMI 无关。奇怪的东西会在整个代码中蔓延。伊克。
当您查看 Exception 的完全限定名称时,java.rmi
是其名称的一部分。考虑一个程序员使用你的代码阅读来期待一个异常java.rmi
,这可能会引起人们的注意,因此是一个坏主意。
特别考虑到这个例外:什么是意外的?您可以UnexpectedSomethingException
改为命名您的班级,以便更清楚地了解正在发生的事情。
@Jon Skeet和@akaIDIOT已经提供了很好的答案。我将添加几个与您的问题相关的示例:
java.rmi.UnexpectedException
从与 RMI 无关的方法处理会很奇怪和令人困惑。
另请注意,异常的主要目的是允许客户端代码处理您自己无法处理的情况。因此,方法抛出的事实java.io.IOException
意味着客户端代码应该负责处理意外的文件输入输出错误(重新检查文件访问/存在,基本设置)。方法抛出java.rmi.UnexpectedException
提示客户端代码检查 RMI 设置
我强烈建议不要仅仅基于它共享您想要的名称这一事实重用另一个异常。例如,在 RMI 上下文之外抛出 java.rmi.UnexpectedException 会非常混乱。
我不确定您打算如何使用您的异常,但对我来说,仅基于名称,听起来您可以只使用 java.lang.RuntimeException,因为它具有相同的一般含义。
所以我的建议是这样的: