簡體   English   中英

I / O超時使用的最佳異常類型是什么?

[英]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,我看到了一些候選人,但出於各種原因,我真的不喜歡其中的任何一個:

  1. java.util.concurrent.TimeoutException (這實際上不是“並發”用法)
  2. java.nio.channels.FileLockInterruptionException (文檔指示此異常的非常具體的原因;與我的情況不符)
  3. 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包含許多超時異常的變體,例如SQLTimeoutExceptionSocketTimeoutException等。但是,不幸的是,沒有諸如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM