我应该在'抛出新的DistrutedIOException()'之前做'Thread.currentThread().interrupt()'吗?
我实现并注意到此函数中可能发生一个。经过一番搜索,我发现捕获并重新抛出一个是很常见的,如下所示:MyInputStream.read()
InterruptedException
InterruptedException
InterruptedIOException
try {
...
} catch (InterruptedException e) {
//Thread.currentThread().interrupt(); // <=== ???
throw new InterruptedIOException();
}
但只有大约50%的代码示例这样做。好吧,人们一致认为,你可以用DisruptedException
做的最糟糕的事情就是吞下它,但是我应该在抛出不同的异常之前重新中断当前线程吗?Thread.currentThread().interrupt()
优点:单个中断请求可能有多个“收件人”。
CONTRA:在清除中断状态之前,某些功能(如日志记录)可能无法正常工作,这可能会导致细微的错误。
CONTRA:我们收到两个关于中断请求的通知:线程的中断状态和异常。最初,只有一个通知:线程的中断状态为 true 或抛出,但不是两者。InterruptedException
优点:没有人真正针对可能引发的i / o异常测试代码,并且与其他i / o异常不同;子句可能会吞噬中断状态。InterruptedIOException
catch(IOException)
PS看起来无论我做什么,这是一种非常特殊的问题,需要一个特殊的处理程序,都不会得到解决。InterruptedIOException
IOException
PPS(编辑)我不能让原始传播,因为不能抛出(它不抛出任何其他东西)。而且我无法预测将调用的上下文:一个实例可以传递给任何接受参数的Java或第三方库函数。InterruptedException
InputStream.read()
InterruptedException
throws IOException
MyInputStream.read()
MyInputStream
InputStream
至于旧的错误,它看起来只是关闭了,没有修复;中断状态的真正想法是代码的行为会有所不同。