gpt4 book ai didi

java - 用于 I/O 超时的最佳异常类型是什么?

转载 作者:行者123 更新时间:2023-11-30 07:57:38 25 4
gpt4 key购买 nike

我编写了一个实现“锁定文件”的 Java 类,以防止周期作业同时运行多次。它基于 java.nio.channels.FileChannel.tryLock 并且运行良好。

我的类允许客户端代码提供一个超时值,指示它愿意等待锁定文件可用的时间长度,如果发生超时,我将抛出一个 IOException。这也很有效。

但我想知道是否可以使用更好 异常类型,因为IOException 非常通用。捕获 IOException 的客户端代码将无法知道问题是否是由于例如超时本身或文​​件系统的其他问题等(当然,除非其他问题抛出 IOException 的子类)。

简要浏览 Java API,我看到了一些候选者,但由于各种原因我不太喜欢它们中的任何一个:

  1. java.util.concurrent.TimeoutException(这不是真正的“并发”用法)
  2. java.nio.channels.FileLockInterruptionException(文档指出了此异常的一个非常具体的原因;与我的情况不符)
  3. java.nio.channels.InterruptedByTimeoutException(与上述类似的原因)

有什么建议吗?

如果可能的话,我更喜欢 Java 7 可用的东西。

编辑

显然,自定义异常类是可能的,但我想知道标准 API 中是否有合适的内容。

最佳答案

我认为 java.util.concurrent.TimeoutException 是合适的。 javadoc 说:

"Exception thrown when a blocking operation times out. Blocking operations for which a timeout is specified need a means to indicate that the timeout has occurred."

您调用 trylock 的方法是作者设想的阻塞操作。

您说:“这并不是真正的“并发”用法”……但这取决于您的观点。您正在使用 Lock API,并且该接口(interface)在 java.util.concurrent 包树中声明。并且假设您正在设计您的 API,以便它可以轻松地在并发应用程序中使用。 (如果不是……为什么不呢?)


IMO,使用 IOExceptionIOException 的现有或自定义子类的唯一参数是,如果客户端操作被建模为一个 I/O 操作。例如,如果 API 使用 I/O 异常来发出其他信号。

另一个反对使用 IOException 的论点是它太笼统了。它表示您的 API 方法的调用者 “您需要为任何 IOException 做好准备”。这包括您的当前实现不会抛出但 future 可能抛出的各种异常。


另一种选择是声明您自己的自定义异常类,它不是 IOException 的子类。从表面上看,这似乎比 I/O 异常更好。


As for the "implementation detail" issue, the class is designed and documented to use an on-disk file as a locking mechanism. So while it definitely is an implementation detail, it's the definition of the implementation, interface, etc. so I think IOException is at least not inappropriate.

我认为指定这样的 API 不是一个好主意。假设您稍后决定另一种锁定可能更合适。如果您在界面中指定了锁定详细信息,则无法更改它们。或者至少,如果不以可能破坏 API 现有客户端的方式“重写契约(Contract)”的话。

关于java - 用于 I/O 超时的最佳异常类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41069899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com