如何在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方法暂停执行指定的毫秒数.没有错误是完全随机的,大多数只会通过再次尝试才能工作,因为尝试之间的时间发生了变化.暂停执行该线程将为此提供更大的机会窗口(例如,数据库引擎启动的时间更长).
这样的事情怎么办
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 块做一些事情,以便它捕获您预期的异常,而不是捕获所有的异常。