【发布时间】:2013-11-19 06:07:22
【问题描述】:
我已经阅读了许多关于正确异常处理的博客/文章/书籍章节,但我仍然不清楚这个主题。我将尝试用以下示例来说明我的问题。
考虑具有以下要求的类方法:
- 接收文件路径列表作为参数
- 读取每个文件的文件内容,如果尝试这样做有任何问题,请跳过
- 返回代表文件内容的对象列表
所以规格很简单,下面是我可以开始编码的方法:
public class FileContent
{
public string FilePath { get; set; }
public byte[] Content { get; set; }
public FileContent(string filePath, byte[] content)
{
this.FilePath = filePath;
this.Content = content;
}
}
static List<FileContent> GetFileContents(List<string> paths)
{
var resultList = new List<FileContent>();
foreach (var path in paths)
{
// open file pointed by "path"
// read file to FileContent object
// add FileContent to resultList
// close file
}
return resultList;
}
现在请注意,规范中的 2. 表示该方法应该“跳过任何由于某种原因无法读取内容的文件”。所以发生这种情况可能有很多不同的原因(例如,文件不存在,文件访问由于缺乏安全权限而被拒绝,文件被锁定并被其他应用程序使用等......)但重点是我应该不在乎原因是什么,我只想尽可能读取文件的内容,否则就跳过文件。我不在乎错误是什么......
那么如何正确实现这个方法呢?
好的,正确处理异常的第一条规则是永远不要捕获一般异常。所以这段代码不好:
static List<FileContent> GetFileContents(List<string> paths)
{
var resultList = new List<FileContent>();
foreach (var path in paths)
{
try
{
using (FileStream stream = File.Open(path, FileMode.Open))
using (BinaryReader reader = new BinaryReader(stream))
{
int fileLength = (int)stream.Length;
byte[] buffer = new byte[fileLength];
reader.Read(buffer, 0, fileLength);
resultList.Add(new FileContent(path, buffer));
}
}
catch (Exception ex)
{
// this file can't be read, do nothing... just skip the file
}
}
return resultList;
}
正确异常处理的下一条规则是:只捕获您可以处理的特定异常。好吧,我不关心处理任何可以抛出的特定异常,我只想检查文件是否可以读取。我怎样才能以适当的最佳实践方式做到这一点?
【问题讨论】:
-
如果没有系统的要求,您的问题将无法解决。遮阳篷是基于意见的,不会解决您的具体情况。
-
真正正确处理异常的第一条规则是永远不要捕获一般异常?
-
@peer:您所指的系统有哪些要求?您的意思是应用程序是 WPF、控制台还是 ASP.NET?请澄清。
-
如果您可以以编程方式检查异常,那么您应该这样做而不是 try/catch 块。所以你应该检查文件是否存在,检查你是否有打开它的权限等等,这里根本不要使用 try/catch 块。
标签: c# .net exception exception-handling