2012-07-26 162 views
2

我是新手关于Try/Catch的。在下面的代码中,我有一个简单的测试来检查文件是否存在。在我的C#课的任务中,我必须使用Try/Catch,并且我不确定如何使用它,如果我仍然在Try部分中使用if语句,或者有更好的方法来检查文件是否存在里面试试?如果文件是简单的txt文件或序列化文件,有什么区别吗?检查文件是否存在Try/Catch

​​

的try/catch语句办法,我必须使用

try 
{ 
code to check if file exist here 
} 
catch 
{ 
error message here 
} 
+1

File.Exists不会引发任何异常,所以我不觉得有什么真的有任何需要尝试抓住那里。你可以使用一些更好的例子来使用try-catch。 – AksharRoop 2012-07-26 06:59:41

+0

您可能想检查文件是否丢失,然后显示消息框。也许尝试如果(!文件。存在) – Greg 2012-07-26 07:00:31

+0

如果可能的话,远离try-catch,除非你想要一个异常,并且你知道如何处理它,或者你想捕获任何异常来记录它,而不是让它最终崩溃你的应用程序。 – 2012-07-26 07:07:10

回答

2

你已经检查的文件在你第一次sniplet存在。没有任何需要,这个代码在try/catch块内。

+0

那么,如果他们想要在检查后使用该文件,则仍然存在竞争条件;-) – Joey 2012-07-26 07:01:44

+0

好的,但是在打开和保存文件时,我必须在我的任务中使用Try/Catch或Using。我想老师希望我们处理情况,如果文件不存在或使用没有写入权限 – 2012-07-26 07:13:01

+0

@ 3D-kreativ:在*此*代码中,你已经检查存在。 **可能是**你的老师意味着其他:如果你immagine,你正在写数据到(比如说)USB驱动器上的文件。一个大文件。在写入过程中,您可以从PC中拔出USB。这意味着在写操作过程中文件不再可用(它不存在更多),并且您必须处理这些类型的问题。如果你想检查文件的前缀,使用File.Exists(..),但是如果你打算在文件中写入某些东西,可以使用try/catch来解释我之前写的原因。 – Tigran 2012-07-26 07:36:54

5

如果你想检查文件是否存在而不使用File.Exist,那么你可以尝试在try块中打开文件,然后捕获异常FileNotFoundException

try 
    { 
     // Read in non-existent file. 
     using (StreamReader reader = new StreamReader("TextFile1.txt")) 
     { 
     reader.ReadToEnd(); 
     } 
    } 
catch (FileNotFoundException ex) 
    { 
     MessageBox.Show("The file don't exist!", "Problems!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     // Write error. 
     Console.WriteLine(ex); 
    } 
+0

@Downvoter,关心评论? – Habib 2012-07-26 07:07:05

+0

感谢您的回答!当我尝试你的代码时,我会在Streamreader下面看到一条红线,我猜这里必须有更多的代码来声明这个? – 2012-07-26 07:24:10

+0

只需右键单击它并单击解析,或在顶部包含'using System.IO;' – Habib 2012-07-26 07:25:05

0

您只有在出现意外错误时才使用try/catch,或者您期待访问资源时出现错误。这听起来有点令人困惑,但在你的事业中,却没有。

但是,如果您打开流作为读取文件而不检查文件是否存在,那么将需要try..catch。

总而言之,try..catch's应用于安全性,以及代码复杂/长度。

2

使用throw

try 
{ 
    if (!File.Exists("TextFile1.txt")) 
     throw (new Exception("The file don't exist!")); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+0

你的逻辑与你的例外状态完全相反。 – 2012-07-26 07:15:00

+1

你忘了感叹号!!' – Silvermind 2012-07-26 07:15:39

+0

@Silvermind:谢谢! – Ria 2012-07-26 07:18:18

7
try 
{ 
if (!File.Exists("TextFile1.txt")) 
    throw new FileNotFoundException(); 
} 
catch(FileNotFoundException e) 
{ 
    // your message here. 
} 
6

试试这个:

try 
{ 
    if(!File.Exist("FilePath")) 
     throw new FileNotFoundException(); 

    //The reste of the code 
} 
catch (FileNotFoundException) 
{ 
    MessageBox.Show("The file is not found in the specified location"); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+0

捕获特定异常..:D – AksharRoop 2012-07-26 07:07:51

+0

Yeap,他可以有多个catch,thx ^^ – SidAhmed 2012-07-26 07:13:06

0

与此相关的问题,以下主题将是有趣

http://social.msdn.microsoft.com/Forums/en-NZ/winappswithcsharp/thread/1eb71a80-c59c-4146-aeb6-fefd69f4b4bb

File.Exists API已在窗口8中更改,并且解释是:

当前检查文件是否存在的唯一方法是捕获FileNotFoundException。正如已经指出的有一个明确的检查和开放是一个竞争条件,因此我不希望有任何文件存在的API添加。我相信文件IO团队(我不在该团队中,所以我不确定,但这是我听说过的)正在考虑让这个API返回null,而不是在文件不存在时抛出。与File.Exists

方法不是线程安全的,它是从API删除了Windows 8的所以正好赶上FileNotFoundException异常