从双面包中抛出异常是正确的吗?

时间:2013-03-13 15:50:56

标签: java exception readability

我想抛出一个具有特定名称的异常,并且这种异常已存在于双边包装中。

E.g。 UnexpectedException中的java.rmi。我不使用rmi packege的任何工具,但异常的名称​​正是我需要的东西。

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

4 个答案:

答案 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,因为它具有相同的一般含义。

所以我的建议将按此顺序排列:

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