我正在尝试在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;
}
答案 0 :(得分:2)
如果SyncCustomers()
中有例外情况,您会拨打SyncCustomers
至于好。
让我们假装你的第二次运行是好的,并会返回True
(return 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
IsSyncSuccess
。false
设置为true
IsSyncSuccess
值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;