为什么Catch块在C#中返回语句后执行

时间:2017-12-04 07:37:23

标签: c# asp.net

我正在尝试在C#应用程序中使用try catch但是我面临的问题是假设首次出现互联网问题,然后它再次尝试同步第二次互联网,然后在返回语句之后再次进入catch(CommunicationException comEx)阻止并返回false。

为什么会发生

int SyncFailCount = 0; 
private bool SyncCustomers(long TenantId, DataTable dtCusomers)
{
   bool IsSyncSuccess = false;
    try
    {
        SyncQBClient client = new SyncQBClient();
        client.SynvCustomer(TenantId, dtCusomers);
        SyncFailCount = 0;
        IsSyncSuccess = true;
    }
    catch (CommunicationException comEx) // Mohan: Exception due to Internet issue
    {
        SyncFailCount = SyncFailCount + 1;
        Thread.Sleep(300);
        if (SyncFailCount <= 5)
        {
            SyncCustomers(TenantId, dtCusomers);                 
        }             
    }
    catch (TimeoutException TimeoutEx) // Mohan: Exception due to timeout from web service
    {
        SyncFailCount = SyncFailCount + 1;
        Thread.Sleep(300);
        if (SyncFailCount <= 5)
        {
            SyncCustomers(TenantId, dtCusomers);
        }
        SyncFailCount = 0;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "CashPundit", MessageBoxButtons.OK, MessageBoxIcon.Error);
        SyncFailCount = 0;
    }
    return IsSyncSuccess;
}

4 个答案:

答案 0 :(得分:2)

如果SyncCustomers()中有例外情况,您会拨打SyncCustomers 至于好。
让我们假装你的第二次运行是好的,并会返回Truereturn IsSyncSuccess;

这就是问题,你没有在异常处理中捕获return语句 - True在catch块中丢失了。

不管是否存在异常,都可以尝试使用while循环来同步工作,而不是递归调用该方法。

int SyncFailCount = 0; 
private bool SyncCustomers(long TenantId, DataTable dtCusomers)
{
    bool IsSyncSuccess = false;

    // While there is no success do the loop
    while (!IsSyncSuccess)
    {
        try
        {
            SyncQBClient client = new SyncQBClient();
            client.SynvCustomer(TenantId, dtCusomers);
            SyncFailCount = 0;
            IsSyncSuccess = true;
        }
        catch (CommunicationException comEx) // Mohan: Exception due to Internet issue
        {
            SyncFailCount = SyncFailCount + 1;
            Thread.Sleep(300);
        }
        catch (TimeoutException TimeoutEx) // Mohan: Exception due to timeout from web service
        {
            SyncFailCount = SyncFailCount + 1;
            Thread.Sleep(300);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "CashPundit", MessageBoxButtons.OK, MessageBoxIcon.Error);
            SyncFailCount = 0;
            break;
        }

        // If there are more than 5 Sync Fails, break the loop and return false
        if (SyncFailCount > 5)
        {
            SyncFailCount = 0;
            break;
        }   
    }

    return IsSyncSuccess;
}

答案 1 :(得分:2)

跟踪一个 CommunicationException或TimeoutException以及Thread.Sleep&#34;修复&#34;时发生的情况。这样:

  • 您正在呼叫IsSyncSuccess来自&#34;外部&#34;并将本地变量false设置为SyncCustomers
  • 你最终进入了一个catch区并再次致电IsSyncSuccess
  • 这会将新的 本地变量false设置为true
  • 方法成功并返回IsSyncSuccess
  • 现在你回到了你的方法的原始版本,在catch块中
  • 您忽略了返回的值,并且您方法的原始创新本地false的值仍为SyncCustomers。这是您要返回的价值。

因此,当您从catch块中递归调用IsSyncSuccess = SyncCustomers(...); 时,部分解决方案是不忽略返回值:

{{1}}

但是你仍然需要处理一个可能的无限递归:
当存在CommunicationException或TimeoutException时,您正在增加SyncFailCount,并再次调用SyncCustomers - 这会将SyncFailCount重置为0!你永远不会达到5的限制

答案 2 :(得分:0)

我不太确定您正在使用哪个.net框架但4.0及以上我会建议使用Task方法而不是线程这是示例只希望您可以使用此示例

class Program
{
    static void Main(string[] args)
    {
        Task<int> task = new Task<int>(Test);
        task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
        task.Start();
        Console.ReadLine();
    }

    static int Test()
    {
        throw new Exception();
    }

    static void ExceptionHandler(Task<int> task)
    {
        var exception = task.Exception;
        Console.WriteLine(exception);
    }
}

答案 3 :(得分:-1)

在每个catch块的末尾添加此行

return IsSyncSuccess;