我有一个名为inner_logic()
的函数可以抛出许多类型的异常,每种类型都有两种类型:critical
和non-critical
。 inner_logic()
的逻辑包括"无限"循环,所以在非关键异常的情况下,我希望退回到它。此时你可以问为什么不在循环中捕获非关键异常,原因是它是一个带有少量继承者的抽象类,每个都有一个独特的循环。为了澄清,我想要做的事情是这样的:
public void logic()
{
try
{
inner_logic();
}
catch (non_critical e)
{
// log
logic();
}
catch(critical e)
{
// log
return;
}
public virtual void inner_logic(){}
据我所知,我认为它应该可行,而且所有的电话都是可以接收的,但是感觉有点像黑客。
我的问题是:有没有更好的方法,或者我应该重新考虑我的建议?
答案 0 :(得分:3)
我过去做过类似的事情。我试着避免递归,所以我做了一个循环。
public void logic()
{
bool running = true;
while(running)
{
running = false;
try
{
inner_logic();
}
catch(non_critical e)
{
running = true;
}
}
}
实际上,我做得有点差劲。我计算了非严重错误的数量,而不是布尔值。如果数字超过3,那么我将其作为一个严重错误处理。
答案 1 :(得分:2)
您不应该这样做,就好像应用程序的当前状态意味着重复抛出非关键异常一样,将发生堆栈溢出异常。
在方法之外捕获异常并在需要时重复。
答案 2 :(得分:1)
我觉得它应该只是循环:
while (true) // Or probably have a maximum number of retries
{
try
{
// Logic
// Break out of the loop by returning if we succeed
return;
}
catch (NonCriticalException e)
{
// Log, then let the loop continue
}
catch (CriticalException e)
{
// Log, then rethrow (in preference to returning)
}
}
使用您的原始方法,如果非关键异常一直发生,您将获得StackOverflowException
。我肯定会建议添加最大重试次数。 (跟踪重试次数也有利于记录。)