C# 当出现';有什么例外吗?
我正在开发一个应用程序,因为我需要使用RESTAPI,它具有与之关联的令牌。在特定的时间间隔之后,令牌get过期了,所以在这种情况下,假设我尝试调用那个API,它会抛出异常。所以要解决这个问题,我应该刷新catch块中的令牌,并使用GoTo再次执行try块。我读了几篇文章,其中大部分都建议避免使用GoTo 以下是我所指的最佳方法,但我仍然不确定是否采用: 1>C# 当出现';有什么例外吗?,c#,C#,我正在开发一个应用程序,因为我需要使用RESTAPI,它具有与之关联的令牌。在特定的时间间隔之后,令牌get过期了,所以在这种情况下,假设我尝试调用那个API,它会抛出异常。所以要解决这个问题,我应该刷新catch块中的令牌,并使用GoTo再次执行try块。我读了几篇文章,其中大部分都建议避免使用GoTo 以下是我所指的最佳方法,但我仍然不确定是否采用: 1> 2> Catch语句使用GoTo重试相同的逻辑,如果使用不当,可能会很危险 更好的处理方法是编写一些重试逻辑,尝试执行任务的次数有限,理
2> Catch语句使用GoTo重试相同的逻辑,如果使用不当,可能会很危险 更好的处理方法是编写一些重试逻辑,尝试执行任务的次数有限,理想情况下允许您指定异常 如果您不想编写自己的重试逻辑,我建议您使用外部库,例如 其使用示例如下:
// 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
});
//设置策略
var retryPolicy=Policy
.Handle()
怀特先生(
3.
重试尝试=>TimeSpan.FromSeconds(5*重试尝试)
);
//尝试发送消息时,请使用Polly最多重试三次。
retryPolicy.Execute(()=>
{
//你的代码
});
恐怕您试图在错误的地方解决这个问题。如果由于令牌过期而导致对API的请求失败,则应该抛出异常
另一个类,可能是首先负责启动请求的类,可以解决错误(刷新令牌)并重试请求数据
如果您将所有这些职责合并到一个地方,事情可能会很快变得复杂。只需输入重试次数,然后继续跳到逻辑中循环的下一次迭代:
int maxRetry = 10;
for (int i = 0; i<=maxRetry; i++)
{
try
{
//DO YOUR STUFF
}
catch (Exception)
{
//OH NOES! ERROR!
continue; //RETRY!
}
}
其中VeryWrongException是您希望实际管理的异常类型,而不是使用以前的catch条件
额外:
要了解您的代码可以生成和捕获哪些类型的异常,请使用intellisense,它是您的朋友:
恐怕这个问题主要是基于观点,这使它脱离了主题。但是,有些库将对此有所帮助。如果你能证明去.NETCore2.1是合理的,它将在几周内正式发布,那么其中的对象会给出重试逻辑。否则,您应该看看哪一个是用于此目的的开源库(现在是的一部分)?JWT或具有到期时间的东西,您可以访问?我这样做是因为我不会将重试逻辑或任何非异常事件建立在异常的基础上。哦,而且永远不要使用
goto
!拿一张纸把它弄清楚。这样看问题就简单多了。@Crowcoder,我不确定是否使用JWT,但我在成功登录后获得了访问令牌,我必须在每次请求后传递该令牌。该令牌有一个时间限制,因此在该时间限制之后它将过期,调用API将抛出401个未经授权的异常很调皮,您将丢失所有堆栈跟踪。@DavidG谢谢提醒!固定的
catch(VeryWrongException ex)
{
throw;
}
catch (Exception)
{
//OH NOES! ERROR!
continue; //RETRY!
}