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