我正在使用一个图像实用程序,用于将供应商文件的目录映射到我公司的文件架构中。每个供应商图像可能有多个页面,我们不支持。我有一个顶级方法,它从数据库中获取ID并使用它来确定新文件的目录和名称。接下来,它拆分多页图像并将每个图像保存到我们的目录中。如果遇到错误,则会记录问题并删除所有创建的文件:
public void TransferImagesToTargetDirectoryUsingSMLLCNaming()
{
IEnumerable<string> newfilepaths = new List<string>();
try
{
image.ImageName = MergeImageInDatabase(image);
newfilepaths = SaveImage(image);
}
catch
{
LogFailedImage(image);
foreach (string filepath in newfilepaths)
{
File.Delete(filepath);
}
}
}
SaveImage代码:
private IEnumerable<string> SaveImage(SmllcImage image)
{
for (int i = 0; i < image.SourceImages.Count; i++)
{
string newfilepath = "some file path";
image.SourceImages[i].Save(newfilepath);
yield return newfilepath;
}
}
如果发生异常,我希望我可以获得在错误之前创建的任何文件的列表,然后在调用方法的catch块中处理清理。不幸的是,这个实现不起作用 - 任何异常显然会导致yield return语句返回一个空集合。
是否可以从方法返回“部分”集合,包含在出现任何错误之前添加的任何元素?
答案 0 :(得分:2)
如果从SaveImage
抛出异常,则newfilepaths
将保留输入函数之前的值(空列表)。
如果你想在函数运行时填充列表,那么SaveImage
必须有附加参数(列表)并返回void
,然后如果抛出异常,列表将包含所有项目它填充了。
private void SaveImage(SmllcImage image, List<string> theList)
{
for (int i = 0; i < image.SourceImages.Count; i++)
{
string newfilepath = "some file path";
image.SourceImages[i].Save(newfilepath);
theList.Add(newfilepath);
}
}
我实际上想知道你当前的代码是否真的在目录中创建了任何图像。执行SaveImage
时不应创建文件,但枚举结果时不应创建文件,这在当前代码中永远不会创建。