【问题标题】:Exception retry attempts are higher than expected异常重试次数高于预期
【发布时间】:2015-04-29 03:59:58
【问题描述】:

我正在计算基本测试应用程序的例外情况。我期待异常,我们正在 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 个例外?这里是否有正在重置我的时间跨度或重试次数的回发?

【问题讨论】:

  • 很抱歉,当这篇文章发布时发生了一些事情,它最初没有在帖子底部发布我的问题。我刚刚更新了原始帖子,因此现在包含我的问题。

标签: c# sql asp.net exception


【解决方案1】:

我认为时间跨度没有正确传递,但我错了。我需要将初始 SQL 插入分解为它自己的方法。问题是我的重试是一个尝试捕获,它正在重试一个包含原始尝试/捕获的 action()。这导致了尝试捕获中的各种循环,这就是为什么我有这么多异常。我将插入本身分离到一个方法中,然后在第一次尝试时引用它,如果有异常,它会被发送到我的重试,它使用相同的 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);
    }           
 }

对游戏来说还是很新的。我对 cme​​ts 持开放态度,但这段代码可以正常工作。我的异常计数是正常的,我的重试次数正在减少。

【讨论】:

    猜你喜欢
    • 2019-01-23
    • 2011-05-28
    • 1970-01-01
    • 2012-04-05
    • 2015-08-09
    • 2011-07-31
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多