异常重试尝试高于预期

时间:2015-02-26 16:51:59

标签: c# sql asp.net exception

我计算了我的基本测试应用程序的例外情况。我期待异常,我们正在测试SQL高可用性故障转移期间的应用程序行为。当服务器故障转移时,会出现一个闪烁期,短暂地会出现一些异常。我在catch中有一些基本的重试逻辑来计算和处理/重试具有异常的操作。这是我的代码。

我的重试课程:

public static class Retry
{
    public static void DoWithRetry(Action action, TimeSpan sleepPeriod, int retryCount = 3)
    {
        while (true)
        {
            try
            {
                action();
                break; // success!
            }
            catch
            {
                if (--retryCount == 0) throw;
                else Thread.Sleep(sleepPeriod);
            }
        }
    }


}

以下是我在我的捕获中引用它的地方:

catch (Exception ex)
{
    ExCounter++;
    Retry.DoWithRetry(DbInsertTestTable, TimeSpan.FromSeconds(1), retryCount: 3);
    //AppCount.Text = ex.Message;
}

重试有效,但是当我超过100时,我的异常计数似乎已关闭。如果我关闭重试,我只会获得大约5个异常。使用重试逻辑,我希望它在1秒钟的睡眠时间后重试动作,最多3次尝试。我如何获得超过100个例外?这里是否有重置我的时间跨度或重试计数?

1 个答案:

答案 0 :(得分:0)

我认为Timespan没有被正确传递,但我错了。我需要将初始SQL插入分解为它自己的方法。问题是我的重试,这是一个尝试捕获重试一个动作(),其中有原始的try / catch。这导致了尝试捕获中的各种循环,这就是为什么我有这么多例外。我将插入本身分离为一个方法,然后在第一次尝试时引用它,如果有异常,它将被发送到我的重试,它使用相同的SQL方法(而不是使用与Try / Catch相同的SQL插入)。这就是现在的样子。

private void DbInsertTestTable()
{

    string User = System.Web.HttpContext.Current.User.Identity.Name.ToString();
    string ServName = "";
    string SqlStatement = "INSERT INTO [myDB].[dbo].[mytable] ([AppCounterData],[User],[DateTime],[ServName]) VALUES (@COLUMN1,@COLUMN2,@COLUMN3,@@ServerName);";

    using (SqlConnection c = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["webconfconstringname"].ConnectionString))
    {
        SqlCommand cmd = SqlCmdQuery(c, SqlStatement);
        cmd.Parameters.AddWithValue("@COLUMN1", AppCounter);
        cmd.Parameters.AddWithValue("@COLUMN2", User);
        cmd.Parameters.AddWithValue("@COLUMN3", DateTime.Now);
        cmd.Parameters.AddWithValue("@COLUMN4", ServName);
        SqlCmdOpExCl(c, cmd);
    }
}


private void SqlInsertFirstAttempt()
{
    try
    {
        DbInsertTestTable();
    }
    catch (SqlException sqlEx)
    {
        DoWithRetry(DbInsertTestTable, TimeSpan.FromSeconds(1), retryCount: 30);
    }           
 }

这个游戏还是个新手。我愿意接受评论,但这段代码正常运作。我的异常计数是正常的,我的重试次数正在递减。