当出现一些异常时,再次执行代码的最佳方法是什么?

时间:2018-05-09 11:06:50

标签: c#

我正在开发一个应用程序,并且我需要使用具有与之关联的令牌的Rest API。在令牌过期的特定时间间隔之后,在这种情况下,假设我尝试调用该API,它会抛出异常。因此,要解决此问题,我应该在catch块中刷新令牌并使用GoTo再次执行try块。我阅读了几篇文章,其中大部分都建议避免使用GoTo。

以下是我提及的最佳方法,但我仍然不相信是否与之相关:

1> Is it possible to execute the code in the try block again after an exception in caught in catch block?

2 - ; https://blogs.msdn.microsoft.com/abhinaba/2005/10/01/c-try-and-retry/

3 个答案:

答案 0 :(得分:0)

只需重试计数并继续跳到逻辑中循环的下一次迭代:

 int maxRetry = 10;
        for (int i = 0; i<=maxRetry; i++)
        {
            try
            {
                //DO YOUR STUFF
            }
            catch (Exception)
            {
                //OH NOES! ERROR!
                continue; //RETRY!
            }
        }

如果它已经尝试了10次就退出了,那就是它。

你可以用你喜欢的任何循环释放你的幻想,同时,等等。使用符合你需要的那个。

如果有一些非常糟糕的错误需要停止执行循环然后中断然后抛出异常并使用

  catch(VeryWrongException ex)
  {
      throw;
  } 
  catch (Exception)
  {
       //OH NOES! ERROR!
       continue; //RETRY!
  }

其中VeryWrongException是您想要实际管理的异常类型,而不是使用先前的catch条件。

额外: 要了解代码可以生成并捕获它们的异常类型,请使用intellisense,它是您的朋友:

intellisense

答案 1 :(得分:-1)

使用GoTo重试相同逻辑的Catch语句如果使用不当会很危险。

更好的解决方法是编写一些重试逻辑,尝试执行有限次数的任务,理想情况下允许您指定异常。

如果您不想编写自己的重试逻辑,我建议您使用外部库,例如Polly

它的用法示例如下:

// Set up the policy
var retryPolicy = Policy
    .Handle<Exception>()
    .WaitAndRetry(
    3,
    retryAttempt => TimeSpan.FromSeconds(5 * retryAttempt)
    );

// Attempt to send the message, use Polly to retry a maximum of three times.
retryPolicy.Execute(() =>
{
    // Your Code
});

答案 2 :(得分:-1)

我担心你试图在错误的地方解决这个问题。如果您请求API失败,由于令牌已过期,您应该抛出异常。

另一个类,也许是负责首先启动请求的类,可以解决错误(刷新令牌)并重试请求数据。

如果你把所有这些责任合并到一个地方,事情就会变得非常复杂。

相关问题