2016-12-03 68 views
0

我正在处理一个消息库和一个对象的发送方法可能由于多种原因,如套接字被关闭等失败等。抛出一个始终链接的异常是否有意义?

我喜欢检查异常超过运行时异常,但我想知道是否那么应该更早地支持异常链接,这样基础异常总是被包含在另一个更普遍的异常中。

例如,一条消息可能只会抛出检查的SendFailedException,但cause()会更具体,如SocketClosedException。这感觉就像它比单独抛出所有检查过的异常要少得多。

由于其他方法也可以抛出SocketClosedException,所以继承并不适用于此。并非每个关闭的异常都是未能发送的结果。

cause()中的进一步信息包裹起来会不会更合适?我不记得在野外发现以这种方式运作的例外情况,这可能是非常规的,并且让其他人感到困惑。

Java或其他图书馆是否曾经这样做?对我的使用情况适合吗?

+2

几乎每个具有正常检查(或未检查)异常的库都通过继承来定义它们自己的异常层次结构。每当需要重新抛出一个异常时,它应该被用作原因,因为这是它的目的。 – zapl

+0

'并不是每个关闭的异常都是发送失败的结果。“你能举出一个例子:关闭的异常不是无法发送的吗? –

+0

尝试在关闭后从套接字查询无效状态时,可能会抛出关闭的异常。 – Zhro

回答

0

将cause()或 这些结果变得更加混淆是否合适?

您始终可以使用cause来包装原始异常,该异常将提供有关堆栈跟踪中异常的根/原点的更多详细信息。您可以参考异常API here,它解释了如何设置原因来包装异常。

Java或其他图书馆是否曾经这样做?是否适合我的 用例?

在许多库,这种模式是其次,只是针点,在弹簧-MVC,NestedServletException将通过将包装与原因原始异常的容器被抛出。是的,就你而言,你可以通过将原因设置为SocketClosedException来抛出SendFailedException

另外,如果您信息库是来自第三方,确保第三方Exception类不会在你的项目/类传播,而包裹/把它们转换成自己的Exception类,这样你的代码是不是与第三方Exception类紧密结合(即使您必须从中迁移)。