Catch块中的重试?

AAs*_*Ask 8 c# sql

如何在catch块中实现代码?

  try
    {
       // Call a MS SQL stored procedure (MS SQL 2000)
       // Stored Procedure may deadlock 
    }
    catch
    {
       // if deadlocked Call a MS SQL stored procedure (may deadlock again)
       // If deadlocked, keep trying until stored procedure executes
    }
    finally
    {

    }
Run Code Online (Sandbox Code Playgroud)

Con*_*ell 25

建议不要这样做,否则可能会导致程序出现严重问题.例如,如果数据库已关闭怎么办?

但是,这是如何在循环中做到这一点:

for(int attempts = 0; attempts < 5; attempts++)
// if you really want to keep going until it works, use   for(;;)
{
    try
    {
        DoWork();
        break;
    }
    catch { }
    Thread.Sleep(50); // Possibly a good idea to pause here, explanation below
}
Run Code Online (Sandbox Code Playgroud)

更新:正如Disappointment先生在下面的评论中提到的:该Thread.Sleep方法暂停执行指定的毫秒数.没有错误是完全随机的,大多数只会通过再次尝试才能工作,因为尝试之间的时间发生了变化.暂停执行该线程将为此提供更大的机会窗口(例如,数据库引擎启动的时间更长).


Øyv*_*hen 5

这样的事情怎么办

bool retry = true;
while( retry ){
  try{
    ...
    retry = false;
  }
  catch
  {
    ...
  }
  finally
  {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

只要 try 块的最后一行运行( retry = false ),它就会继续。如果发生异常,它将运行 catch 和 finally 块,然后循环回并再次运行 try 块。

如果你只想尝试 x 次,你可以用一个 int 替换重试,初始值为尝试次数。然后在while循环中检查它是否等于0,在循环开始时将其递减,并将其设置为0作为try块的最后一行。

而且您当然应该对那个空的 catch 块做一些事情,以便它捕获您预期的异常,而不是捕获所有的异常。