2010-01-06 106 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可能无法确定文件是否存在。例如,您可能没有权限读取目录(最低权限是件好事)。

相关问题