[英]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.