那么更好的是什么?使用这样的结构:
if (File.Exist(fileName))
{
// do something with file...
}
只是
try
{
// do something with file.
}
catch(Exception ex)
{
}
使用方法File.Exist()吗?
谢谢!
答案 0 :(得分:11)
前者有竞争条件:另一个进程可能会在File.Exists
返回true之后但在打开之前删除该文件。后者没有。即使您事先检查,如果您想忽略不存在的文件,仍应该捕获异常。
所以它应该是
if (File.Exists(fileName))
{
try
{
// ...
}
catch (FileNotFoundException)
{ }
}
或
try
{
// ...
}
catch (FileNotFoundException)
{ }
前者重复检查,如果文件位于网络共享上,则可能会很慢,后者会针对非异常情况引发异常(会被处理),从而使调试变得复杂。两者都有其优点。就个人而言,我通常会选择第二种,但要么是好的。
答案 1 :(得分:5)
异常不应该用于处理应用程序的流程,其目的是避免异常,而不是将它们视为执行流程的正常部分。
对于99.999%的申请,如果有任何性能差异,将不会明显。如果该文件应该在那里并且找不到特殊情况,则可以使用try catch
块,否则我会说你应该采用File.Exist
方法。
答案 2 :(得分:1)
取决于您的计划流程以及您正在执行的操作。如果期望该文件存在,则可以依赖异常处理,因为如果程序不能继续执行,那么很可能需要在调用链中处理更高的异常。
否则,如果相关方法类似于ReadFile()
,您将获得True|False|FileNotFound
返回代码的疯狂。
使用File.Exists“安全地”打开文件是没用的。考虑一下:
public String ReadFile(String filename)
{
if (!File.Exists(filename))
{
// now what? throw new FileNotFoundException()? return null?
}
// Will throw FileNotFoundException if not exists, can happen (race condition, file gets deleted after the `if` above)
using (var reader = new StreamReader(filename))
{
return reader.ReadToEnd();
}
}
有人可能会说你想要检查一个文件是否存在,如果你想向它追加数据,但是StreamWriter构造函数有一个带有append
参数的重载,这将让作者如果文件不存在则创建该文件,如果存在则附加到该文件。
那么,也许问题可能更好:File.Exists
存在哪些有效的用例?幸运的是that question has already been asked and answered。
答案 3 :(得分:0)
首先,我检查文件是否存在,如果不存在则抛出异常。
之后我会使用try-catch块来处理可能抛出的其他异常(权限等)
if (!File.Exist(fileName))
{
throw new ArgumentException("filename");
// or throw new FileNotFoundException("filename");
}
try
{
// do something with file.
}
catch(Exception ex)
{
}
答案 4 :(得分:0)
第一种情况 -
if (File.Exist(fileName)) //A single statement to check and proceed.
虽然后面的异常处理方法涉及 -
要创建的异常类的object
,如果引发异常,则将其传递给相应的catch块。
我更喜欢第一种方法,因为使用异常处理来处理执行流程并不是一个好主意。