为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
江户川乱折腾 2021-06-04 14:02:37
我正在开发一个应用程序,因此我需要使用具有与之关联的令牌的 Rest API。在特定时间间隔后,令牌已过期,因此在这种情况下,假设我尝试调用该 API 会引发异常。因此,要解决此问题,我应该刷新 catch 块中的令牌并使用 GoTo 再次执行 try 块。我阅读了几篇文章,其中大部分都建议避免使用 GoTo。
查看完整描述

3 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

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


 int maxRetry = 10;

        for (int i = 0; i<=maxRetry; i++)

        {

            try

            {

                //DO YOUR STUFF

            }

            catch (Exception)

            {

                //OH NOES! ERROR!

                continue; //RETRY!

            }

        }

当它尝试了 10 次后,它就会退出,仅此而已。


您可以使用任何您喜欢的循环、while、do while 等来释放您的幻想。使用适合您需求的循环。


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


  catch(VeryWrongException ex)

  {

      throw;

  } 

  catch (Exception)

  {

       //OH NOES! ERROR!

       continue; //RETRY!

  }

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


额外:要了解您的代码可以生成和捕获什么样的异常,请使用智能感知,这是您的朋友:

//img1.sycdn.imooc.com//60bad55300017a0305390177.jpg

查看完整回答
反对 回复 2021-06-05
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

如果使用不当,使用 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

});


查看完整回答
反对 回复 2021-06-05
?
达令说

TA贡献1821条经验 获得超6个赞

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

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

如果您将所有这些职责合并到一个地方,事情可能会很快变得复杂。


查看完整回答
反对 回复 2021-06-05
  • 3 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信