C# 在C中投内接球#
昨天发现了一些东西,让我意识到我很可能仍然错过了关于C#的基本花絮 我有一个无状态服务结构应用程序。我试着在主while环上接球。如果我在这个循环中抛出一个异常,它将跳出while循环,服务将有效地停止。如果我在catch子句中添加一个C# 在C中投内接球#,c#,throw,rethrow,C#,Throw,Rethrow,昨天发现了一些东西,让我意识到我很可能仍然错过了关于C#的基本花絮 我有一个无状态服务结构应用程序。我试着在主while环上接球。如果我在这个循环中抛出一个异常,它将跳出while循环,服务将有效地停止。如果我在catch子句中添加一个throw,服务将重新启动 protected override async Task RunAsync(CancellationToken cancellationToken) { try {
throw
,服务将重新启动
protected override async Task RunAsync(CancellationToken cancellationToken)
{
try
{
long iterations = 0;
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(TimeSpan.FromSeconds(3), cancellationToken).ConfigureAwait(false);
// Do stuff...
if (iterations > 4) {
throw new Exception();
}
ServiceEventSource.Current.ServiceMessage(this.Context, $"Working-{++iterations}");
}
}
catch (Exception ex)
{
// Log stuff...
throw;
}
}
有人能解释一下为什么会这样,或者告诉我在哪里可以得到答案吗?我找不到任何解释这种行为的东西
编辑:它不是的副本,因为据我所知,它没有解释我的问题,为什么要再次运行该函数。该主题更多地解释了堆栈跟踪的
throw
和throw new
之间的区别 根据您的描述,我们有两种选择:
RunAsync
任务因该异常而失败
RunAsync
任务
已顺利完成(捕获的异常在循环时中断了,因此方法退出)
FabriceException
派生的异常将导致重新启动,而其他异常则是预期的或意外的服务中止,并导致其停止
在逻辑上,优雅的完成意味着服务成功地完成了执行,并将按照关闭。可能的重复。您可以发布不同的替代代码吗?目前很难说你在问什么。也许这会有所帮助:我的假设是,程序的这一部分再次被包装在某个地方,抛出异常被转换为带故障退出,而实际返回则被呈现为正常关闭(由于异常中断了
while
循环之外的执行线程,因此该方法退出)“我很可能仍然缺少关于C#的基本花絮。”,我不会称之为“基本的”,异步代码的异常处理看起来很简单,但它非常微妙,实际上并不琐碎。啊,那就更有意义了。我想我误解了抛出和重新抛出在C#中的作用。难怪我找不到满意的答案。谢谢!