如何在实现自定义回滚时通知问题?

时间:2013-03-07 07:24:05

标签: c# error-handling

我正在使用ADO.NET EF,我需要在Save()方法中实现某种自定义回滚。逻辑是这个

  • 我有OpenFileDialog,调用Save()时的第一步是检查是否有所选图像以及是否要将所选图像复制到新位置。
  • 然后我设置实体的属性,包括图片名称(这是我选择先复制图像的原因),并使用此方法检查是否没有重复的唯一值:HasDuplicatingEntity(entity)
  • 如果复制过程进展顺利且没有具有相同唯一值的实体,那么我将保存实体本身:Save(entity)
  • 如果Save(entity)出现问题,我只需要删除之前复制的图片(如果有的话),那就是它。

实际的实现是这样的:

try
{
  SaveImage();
  if(HasDuplicatingEntity(entity))
  {  
    //Show message to the user
    return false;
  }
  Save(entity);
}
catch
{
  //Log the exception and show message
  //Delete the image if there is such
}

出现的问题是,如果我尝试使用所选图像保存新实体,但HasDuplicatingEntity(entity)返回true。然后使用当前逻辑,我只是​​向用户显示已经有一个具有相同唯一值的实体,然后只返回false,在选择图像然后复制的情况下,在我的文件系统中留下一个未使用的图像。

这引出了我的确切问题。我有一个方法,意味着在出现问题时删除图像,但它在catch子句中调用。现在,当我看到另一个地方我可能需要删除图像时,我看到两个选项 - 只需从if中调用该方法:

if(HasDuplicatingEntity(entity))
      {  
        //Show message to the user
        //Delete Image
        return false;
      }

这有点合乎逻辑但是除了方法调用之外我还有一些检查以确定是否实际存在复制的图像,因为图像不是必需的,这将导致几行重复代码。另一种选择是抛出异常并转到我已经处理过这个问题的catch子句,但这意味着要改变管理这种情况的当前方式。这个确切的部分:

if(HasDuplicatingEntity(entity))
      {  
        //Show message to the user
        return false;
      }

是继承的,我没有太多经验,所以我不想把好事变成坏事,所以我想知道哪个是处理这个问题的正确方法。

0 个答案:

没有答案