在捕获非严重错误时回忆起自己的功能

时间:2013-11-21 13:56:39

标签: c# exception try-catch

我有一个名为inner_logic()的函数可以抛出许多类型的异常,每种类型都有两种类型:criticalnon-criticalinner_logic()的逻辑包括"无限"循环,所以在非关键异常的情况下,我希望退回到它。此时你可以问为什么不在循环中捕获非关键异常,原因是它是一个带有少量继承者的抽象类,每个都有一个独特的循环。为了澄清,我想要做的事情是这样的:

public void logic()
{
try
{
 inner_logic();
}
catch (non_critical e)
{
  // log 
  logic();
}
catch(critical e)
{
 // log 
 return;
}

public virtual void inner_logic(){}

据我所知,我认为它应该可行,而且所有的电话都是可以接收的,但是感觉有点像黑客。

我的问题是:有没有更好的方法,或者我应该重新考虑我的建议?

3 个答案:

答案 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。我肯定会建议添加最大重试次数。 (跟踪重试次数也有利于记录。)