吃异常还是查空?
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 应用程序已过时。
我有以下代码:
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 应用程序已过时。