吃异常还是检查空?

时间:2017-11-25 13:43:52

标签: c# exception uwp visual-studio-2017 storagefile

我有以下代码:

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 debug warner忽略这个错误(说“不要破坏这个异常”),我应该让“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?

所以问题仍然存在。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

第四个也是最好的解决方案是使用StorageFile.TryGetItemAsync返回文件(如果存在)或null(如果文件不存在)。

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

2011年Windows Store应用程序无法检查的链接主题是正确的。2017年UWP应用程序已经过时。

答案 2 :(得分:1)

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

如果没有捕获异常,则不会执行下一行,因此您无法将文件检查为null(与C ++等其他编程语言不同)。

选项,不要破坏此选项,只在不抛出异常时才暂停(激活断点)应用程序,不会改变程序的行为。