帮助try catch语句

时间:2011-06-29 10:25:20

标签: c# asp.net try-catch

我正在创建一个连接到数据库并使用ODBC连接器的web应用程序,我使用以下代码来执行此操作

private void SetupConnection()
{
    conn.ConnectionString = 
        ConfigurationManager.ConnectionStrings["live"].ConnectionString;

    OdbcDataAdapter da = 
        new OdbcDataAdapter("SELECT * FROM MTD_FIGURE_VIEW1 '", conn);

    da.Fill(ds);
}

我想创建一个try catch语句,它将继续尝试连接到数据库。

psudocode将尝试上面的功能,如果无法连接再试一次,如果连接没有任何错误继续进行。

有人可以帮我这个

从评论中提问相关更新:

  

我只是希望它继续尝试   原因是Web应用程序   即时通讯永远不会改变它   不断刷新数据,但是   数据库被切换了两个小时   每晚都要备份   期间我希望应用程序继续   试图连接

3 个答案:

答案 0 :(得分:2)

怎么样,

const int MaxRetries = 42 //or any other number you like

for (int r = 1; r <= MaxRetries; r++)
{
    try
    {
        //The thing we want to test
        break;
    }
    catch (SomeExceptionWeWantToIgnore)
    {
        System.Threading.Thread.Sleep(1000) 
        //Or any number of milliseconds you like (not 0)
    }
} 

如果这是你想做多次并重新使用的事情。 Youi可以考虑把它放在一个可恢复的函数中,就像我在this answer中所做的那样,警告这可能是一种过度杀伤。

答案 1 :(得分:2)

private void SetupConnection()
{
    conn.ConnectionString = 
        ConfigurationManager.ConnectionStrings["ZenLive"].ConnectionString;

    bool success = false;

    while(!success)
    {
        try
        {
            OdbcDataAdapter da = 
               new OdbcDataAdapter("SELECT * FROM MTD_FIGURE_VIEW1 '", conn);

            da.Fill(ds);
            success = true;
        }
        catch(Exception e)
        {
            Log(e);
            Thread.Sleep(_retryPeriod)
        }
    }
}

注意,正如人们评论的那样,真的不是一个好主意。您需要一些方法来区分数据库关闭的“预期”异常和您想要继续重试的情况,以及发生意外情况并且您不想继续尝试的情况。

答案 2 :(得分:1)

如果数据库未启动,则尝试连接数据库是没有意义的。你只是在浪费时间尝试连接到备份的东西。我会做这样的事情:

DateTime backupStart = Convert.ToDateTime("20:00:00");
DateTime backupEnd = Convert.ToDateTime("22:00:00");
DateTime now = DateTime.Now;

while (true)
{
    // If its backup time then sleep for 2 hours, 0 min and 0 seconds
    if (now > backupStart && now < backupEnd)
    {
        System.Threading.Thread.Sleep(new TimeSpan(2, 0, 0));
        now = DateTime.Now; // So we dont sleep again later
    }

    try
    {
        // Try db connect
        // Break if successful
        break;
    }
    catch (Exception ex)
    {
        // Wait 30 seconds then loop then try again
        System.Threading.Thread.Sleep(new TimeSpan(0, 0, 30));
    }
}