吃异常还是查空?

Eat exception or check 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 抛出错误:

我应该

1) 让 IDE 调试 warner 忽略这个错误(比如 "Don't break on this exception"),我应该让 "if (file != null)" 完成工作

2) 或者我应该检查文件是否确实存在

3) 使用 try-catch?

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

    private async Task <bool> LocalExists(string uFileName)
    {
        bool b = false;
        //
        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?

所以问题依然存在。

您可以先检查文件是否存在,或者处理异常。

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

选项,不中断此选项,仅在抛出异常时不暂停(激活断点)应用程序,不会更改程序的行为。

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

在您提出的三种解决方案中(忽略错误,先检查文件是否存在,或捕获异常),只有捕获异常才有效。忽略异常将使应用程序崩溃。在调用 GetFileAsync 之前检查文件是否存在存在计时问题,文件可能在检查之后但在打开文件之前被删除。

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

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

链接线程说无法检查是否正确适用于 2011 年的 Windows Store 应用程序。对于 2017 年的 UWP 应用程序已过时。