【问题标题】:Is there a way to handle all file/folder exceptions有没有办法处理所有文件/文件夹异常
【发布时间】:2015-01-06 13:39:33
【问题描述】:

在我详细说明我的问题之前 - 我不是专业的程序员/编码器,但最近的一个项目涉及大量读取文件、写入文件、将文件移动到文件夹等,我想知道如何最好地处理来自多个来源(所有这些都是文件/文件夹读取/写入)。

该项目在某些基于文件的操作上具有基本的“重试”功能,它会休眠一到两秒钟,然后重试 X 次 - 然后它会抛出一个消息框,基本上说明它无法执行它。

有没有办法接受任何/所有文件/文件夹访问异常,为其创建一个“重试”例程 - 让它重试之前尝试做的事情(但失败了),然后最终放弃并提醒某人 - 或这是每个文件操作都应该做的事情吗?

我想我的想法是,对于许多应用程序,如果操作失败 - 应用程序知道它之前在做什么并可以重试它 - 而不是编写相同的“重试”代码(修改代码基于尝试了什么操作)- 是否可以有一个例程来重试它?

我什至不确定这是否可能,更不用说推荐了。

“重试”代码非常基本,如下所示:

int retrycount = 3;
int retries = 0;

while (retries < retrycount)
{
   try
   {
      File.Copy(SomeFile, SomeOtherFile);
   }
   catch (Exception e)
   {
      // Try Again
      retries++;
   }

   if (File.Exists(SomeOtherFile) == true)
   {
      break;
   }
}

稍后,“重试”用于确定它是否完全失败(重试 == 重试计数)并在发生这种情况时发出警报。

如果有人可以提供任何建议,或者即使只是告诉我我的想法是可能的 - 不建议这样做,会有所帮助。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您可以通过传递 Action 来做到这一点:

    public void Retry(Action action, int retryCount)
    {
        int retries = 0;
    
        while (retries < retryCount)
        {
           try
           {
              action();
              return;
           }
           catch (Exception e)
           {
              // Try Again
              retries++;
           }
        }
    }
    
    
    Retry(() => File.Copy(SomeFile, SomeOtherFile), 3);
    

    编辑:当然之前有人问过这个问题,请参阅How to implement re-try n times in case of exception in C#?

    【讨论】:

    • 我会通过使用for 稍微改变这一点,节省一些代码行,而不是声明e,因为这会引发警告。
    • @Andrew 你是对的,但是在回答时我倾向于使代码尽可能接近 OP 的代码。从整个重写中,他们往往学到的东西更少。 ;)
    • 这种事情是否适用于其他事情,例如数据库访问 - 例如尝试插入记录?
    • 它适用于任何事情。在这种情况下,您可能只想在重试之间添加延迟。第三个参数将是一个不错的选择。
    【解决方案2】:

    一种方法:

    • 1 创建Queue{File, LastAttempt, Attempts}
    • 2 将所有文件添加到队列中
    • 3 从列表中获取条目
    • 4 如果自上次尝试后没有足够的时间,请等待
    • 5 尝试操作,递增Attempts
    • 6 如果操作失败,将LastAttempt 更新为DateTime.Now,添加回队列末尾(除非Attempts 大于某个阈值,在这种情况下您将文件添加到失败文件列表中)
    • 7 如果队列中还有条目,从 3 开始重复

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多