2017-11-25 232 views
0

我有以下代码:吃异常或检查null?

private async Task <string>IsolatedStorageReadTextFile(string uFileName) 
{ 
     string sRet = ""; 

     StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(uFileName); 
     if (file != null) 
     { 
      using (var inputStream = await file.OpenReadAsync()) 
      using (var classicStream = inputStream.AsStreamForRead()) 
      using (var streamReader = new StreamReader(classicStream)) 
      { 
       while (streamReader.Peek() >= 0) 
       { 
        sRet = streamReader.ReadLine(); 
       } 
      } 
     } 
     return sRet; 
} 

当有问题的文件不存在,IDE将抛出一个错误:

enter image description here

我应该

1)让IDE调试华纳忽略这个错误(说“不要打破这个异常”),我应该让“if(file!= null)”做这个工作

2)或者我应该检查文件是否真的存在

3)使用try-catch?

我不得不根据答案添加的代码的重要组成部分:

private async Task <bool> LocalExists(string uFileName) 
    { 
     bool b = false; 
     //https://stackoverflow.com/questions/8626018/how-to-check-if-file-exists-in-a-windows-store-app 
     try 
     { 
      StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(uFileName); 
      b = (file != null); 
     } 
     catch (Exception ex) 
     { 
      b = false; 
     } 

     return b; 
    } 

这将引发同样的异常,因为在UWP,似乎有检查没有别的办法,如果一个文件不是试图访问实际存在它:

How to check if file exists in a Windows Store App?

所以问题仍然存在。

+0

切勿使用异常来驱动你的代码流。调用之前的File.Exists将避免很多麻烦。 (不是100%安全,但仍然....) – Steve

回答

1

您既可以检查之前存在的文件,也可以处理异常。

当你没有捕捉到异常,下一行将不会被执行,因此你不能检查文件为空(不像其他编程语言,如C++)。

这个选项不要在这个选项上打破,只有当只抛出异常时不会暂停(激活一个断点)应用程序,不会改变程序的行为。

+1

我想补充一点,检查文件是否存在意味着简单地尝试访问它:https://stackoverflow.com/questions/8626018/how-to-check-if -file-exists-a-windows-store-app,所以在任何情况下都需要try-catch,我想。 – tmighty

+0

这只适用于Windows应用商店。您可以通过https://msdn.microsoft.com/en-us/library/system.io.file来检查文件是否存在。存在(v = vs.110).aspx –

+1

我正在处理UWP。你是说当你说“Windows Store App”时,对吗? – tmighty

2

您应该检查文件是否存在,除非它始终存在,例如,因为它是你程序的一部分。尽管如此,你应该使用try catch来捕捉整个事物,因为即使文件存在,它也可能被锁定或者可能发生不同的读取错误。

2

在你提出的三种解决方案中(忽略错误,首先检查文件是否存在,或者捕获异常),只有捕获异常才有效。忽略异常会让应用崩溃。在调用GetFileAsync之前检查文件是否存在有一个时间问题,在该文件可能在检查之后但在打开文件之前被删除。

第四个也是最好的解决方案是使用StorageFile.TryGetItemAsync在文件存在的情况下返回文件,否则返回null。

StorageFile file = await ApplicationData.Current.LocalFolder.TryGetItemAsync(uFileName) as StorageFile; 
if (file != null) 
{ 
    //... 
} 

链接的线程它说有没有办法来检查是正确的Windows Store应用程序在2011年它已经过时了UWP的应用程序在2017年