【问题标题】:Eat exception or check null?吃异常还是检查null?
【发布时间】:2018-05-09 06:10:36
【问题描述】:

我有以下代码:

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 调试警告器忽略这个错误(比如“不要中断这个异常”),我应该让“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?

所以问题仍然存在。

【问题讨论】:

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

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    链接的线程表示无法检查 2011 年的 Windows 应用商店应用程序是否正确。2017 年的 UWP 应用程序已过时。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我想补充一点,检查文件是否存在意味着简单地尝试访问它:stackoverflow.com/questions/8626018/…,所以我认为目前无论如何都需要 try-catch。
      • 这仅适用于 windows 商店应用程序。您可以通过msdn.microsoft.com/en-us/library/… 来检查文件是否存在
      • 我正在处理 UWP。你的意思是当你说“Windows Store App”时,对吧?
      • 对不起,我需要测试和调查一下才能接受。
      • 我根据我的调查更新了我的问题。我仍在处理未找到的异常。
      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 2012-06-15
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多