2010-01-06 88 views
2

我是新來的例外,還沒有在大學裏覆蓋他們,所以仍然在學習他們。我試過這個,它似乎工作,但似乎並不「正確」。處理異常後再次嘗試方法的正確方法是什麼?處理異常後再次嘗試方法的正確方法是什麼?

public static void openCSV(String file) { 
    FileInputStream fis; 

    try { 
     fis = new FileInputStream(file); 
    } catch (FileNotFoundException e) { //fnf, probably not downloaded yet. 

     downloadCSV(file); //Download it and try again. 

     try { 
      fis = new FileInputStream(file); 
     } catch (FileNotFoundException e) { 
      // OK, something else is the problem. 
     } 
    } 
} 

回答

2

這是一種異常濫用的形式。如果有時文件必須被下載,你不應該依賴例外來告訴你。

嘗試這樣:

public static void openCSV(String file) { 
    FileInputStream fis; 

    try { 
     if (!(new File(file).exists())) { 
      downloadCSV(file); //download it 
     } 
     fis = new FileInputStream(file); 
     // should probably use the stream here, so you can close it in a finally clause linked to this try clause... 
    } catch (FileNotFoundException e) { //file doesnt exist 
     // Re-throw as a declared exception, a RuntimeException, and/or log it... 
    } finally { 
     if (fis != null) { 
      try { 
       fis.close(); 
      } catch (IOException ioe) { 
       // write exception to logs or take other appropriate action... 
      } 
     } 
    } 
} 
+1

'fis.close()'應該在另一個'try/catch'塊中。 – BalusC 2010-01-06 17:59:24

+0

BalusC是正確的。編輯。 – 2010-01-06 18:23:56

0

在這種情況下,您正在使用第一個塊的異常處理不正確。

您可以簡單地檢查文件是否第一次存在,然後嘗試下載它。

4

你的問題本身並不是關於「例外」,而是關於設計的一般問題。你會得到很多很多關於正確處理這個問題的意見。

最明顯的解決方法是

if (!new File(file).exists()) { 
    downloadCSV(file); 
} 
try { 
    fis = new FileInputStream(file); 
} catch (IOException e) { 
    // scream 
} 
+1

請注意'file'是'String'他的情況。他需要先構建'File'。 – BalusC 2010-01-06 17:25:40

+0

非常感謝,BalusC。編輯。 – 2010-01-06 17:26:17

+0

不要忘記警告有關相對路徑的潛在問題;)+1。 – BalusC 2010-01-06 17:28:41

2

我想盡量避免使用異常一樣,在那裏我可以幫助它。這是一個這樣的案例:

public static void openCSV(String file) { 
    FileInputStream fis; 

    if (!(new File(file).exists())) { 
     downloadCSV(file); //download it and try again 
    } 

    try { 
     fis = new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     // ok something else is the problem; 
    } 
} 
0

雖然你的具體的例子可能不是你通常會檢查文件是否存在做,你的方法是正確的。一般來說,如果發生相同的錯誤,您希望捕獲異常,可能再試一次,告訴用戶失敗,並且他們應該嘗試其他方法或聯繫支持人員。

1

您應該撥打電話downloadCSV(file);openCSV(file)以外。如果FileNotFoundException異常被發現,則應重新投遞給調用者。您還應該使用finally塊來關閉流。

0

我沒有看到有問題的代碼。 (除了我會把它放進自己的方法;不使用由首字母縮寫像fis; openCSV或許應該拋出一個異常,可能不應該是一成不變的。)

明顯的理由,爲什麼你不想要使用File.exists是文件路徑上的兩個操作不會是原子的。這是文件操作的常見問題。儘可能保持原子的原子(注意,這與「只做一件事」相反)。兩個操作也可能比一個操作慢。

此外,File.exists可能無法確定文件是否存在。例如,您可能沒有權限讀取目錄(最低權限是件好事)。

相關問題