[英]What is the best exception type to use for an I/O timeout?
我编写了一个Java类,该类实现了一个“锁定文件”,以防止定期作业并发运行多次。 它基于java.nio.channels.FileChannel.tryLock
并且运行良好。
我的类允许客户端代码提供一个超时值,该值指示等待锁文件变得可用的时间,如果发生超时,则抛出IOException
。 这也很好。
但是我想知道是否有更好的异常类型要使用,因为IOException
是相当通用的。 捕获IOException
客户端代码将无法知道问题是否是由于超时本身或文件系统的其他问题等引起的(当然,除非其他问题引发了IOException
的子类)。
简要地翻阅Java API,我看到了一些候选人,但出于各种原因,我真的不喜欢其中的任何一个:
java.util.concurrent.TimeoutException
(这实际上不是“并发”用法) java.nio.channels.FileLockInterruptionException
(文档指示此异常的非常具体的原因;与我的情况不符) java.nio.channels.InterruptedByTimeoutException
(与上述类似原因) 有什么建议么?
如果可能的话,我希望可以在Java 7中使用。
编辑
显然,可以使用自定义异常类,但是我想知道标准API中是否有合适的东西。
我认为java.util.concurrent.TimeoutException
是合适的。 Javadoc说:
“阻塞操作超时时引发异常。为其指定了超时的阻塞操作需要一种手段来指示发生了超时。”
按照作者的设想,调用trylock的方法是一种阻塞操作。
您说:“这不是真正的“并发”用法”……但这取决于您的观点。 您正在使用Lock
API,并且在java.util.concurrent
包树中声明了该接口。 大概是在设计API,以便可以在并发应用程序中轻松使用它。 (如果没有...为什么不呢?)
IMO,使用唯一的好争论IOException
或现有的或自定义子类IOException
,如果客户端操作建模为I / O操作会。 例如,如果API使用I / O异常来发出其他信号。
反对使用IOException
另一个论点是它太笼统了。 它说您的API方法的调用者“您需要为任何 IOException
做好准备” 。 这包括您当前的实现不会抛出的各种异常,但将来可能会抛出。
另一种选择是声明您自己的自定义异常类,它不是IOException
的子类。 从表面上看,这似乎比I / O异常要好。
对于“实现细节”问题,该类经过设计和记录,可以使用磁盘上的文件作为锁定机制。 因此,尽管它绝对是实现细节,但它是实现,接口等的定义。因此,我认为IOException至少不是不适当的。
我会认为指定这样的API是一个坏主意。 假设您稍后决定另一种锁定可能更合适。 如果您在界面中指定了锁定详细信息,则无法更改它们。 或至少,并非没有“重写合同”的方式,这可能会破坏现有的API客户端。
创建一个扩展IOException的自定义异常类。 这允许客户端根据需要处理特定的异常,或者作为通用IOException以及可能导致故障的所有其他原因来处理。
易于实施。 呼叫者易于使用。
JDK包含许多超时异常的变体,例如SQLTimeoutException , SocketTimeoutException等。但是,不幸的是,没有诸如TimeoutException
类的父类可以扩展或通常用于所有Timeout异常。
因此,您可以编写一个自定义Exception并使用它,如下所示:
public class FileTimeoutException extends IOException {
private String message;
public FileTimeoutException(String message) {
this.message= message;
}
//add the other required methods
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.