在没有使用方法递归或goto语句的情况下发生异常后,有没有简单的方法在try / catch块中重复代码?我正在调用一个Web服务,然后使用Entity Framework将该数据推送到SQL数据库,如果第一个步骤在第一个步骤成功后失败,我宁愿采用更简单或更简洁的方式重新尝试该步骤而不是递归相同的方法(这两个步骤在不同的方法中用于此目的)或使用goto语句。
答案 0 :(得分:5)
首先,如果你进入catch
区块,那么建议进行清理和记录,而不是使用goto
或recursion
。
现在回答你的问题;
将您的两个步骤保持在Transaction
块内,并按照尝试输入的方法,否则尝试执行一段代码,直到您成功或有限次数。
//Code outline only idea and not production quality code.
var timesTried=0
while(timesTried<5) //here I try trying to execute 5 times
{
using(var tran = new TransactionScope())
{
CallMethodA();
CallMethodB();
tran.Complete();
timesTried=6
}
timesTried++;
}
答案 1 :(得分:3)
你的用例不是很清楚,但听起来你需要一个简单的状态机:
var state = 0;
while(state < 2)
{
try
{
if(state == 0)
{
CallWebService();
state = 1;
}
if(state == 1)
{
PushData();
state = 2;
}
}
catch
{
// do something useful (log, decrement retry count, etc.)
}
}
答案 2 :(得分:2)
如果您只想重复一次,可以使用委托:
这样的事情:
bool failedOnce = false;
Action myAction = delegate
{
try
{
...
}
catch
{
failedOnce = true;
}
};
myAction();
// try again
if (failedOnce)
{
myAction();
}
答案 3 :(得分:1)
你可以使用 做{ } 而(x == ??)
环。如果使用finally语句
导致异常,您也可以完成可能遗漏的任何其他操作答案 4 :(得分:1)
考虑一个可以调用操作方法的包装器方法。以下是一个粗略的样本...
private void Wrapper()
{
try
{
Method();
}
catch
{
Method();
}
}
private void Method()
{
try
{
// Operations
}
catch
{
throw;
}
}
祝你好运!
答案 5 :(得分:0)
Importent永远不会抑制异常只是重复你也可以在重复中建立一些延迟,但请不要压抑。
private static void DoQuery(DbContext dbContext, int throwCounter)
{
try
{
Query();
}
catch (Exception ex)
{
if (throwCounter< 10)
{
DoQuery(dbContext, throwCounter++);
}
else
{
throw;
}
}
}
如果您想要非常专业地检查此链接:http://msdn.microsoft.com/en-us/library/hh680905(v=pandp.50).aspx
如果您使用的是EF6而不是支持重试策略。