在 C# 中抛出内部 Catch
Throw inside Catch in C#
昨天发现的一些东西让我意识到我很可能仍然缺少关于 C# 的基本花絮。
我有一个无状态 Service Fabric 应用程序。我在主 while 循环周围有一个 try-catch。如果我在这个循环中抛出一个异常,它就会跳出 while 循环并且服务有效地停止。如果我将 throw
添加到 catch 子句,服务将重新启动。
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;
}
}
谁能解释这是为什么,或者告诉我在哪里可以得到答案?我找不到任何可以解释此行为的内容。
编辑:它不是 Is there a difference between "throw" and "throw ex"? 的副本,因为据我所知,它没有解释我的问题,为什么函数又是 运行。该主题更多地是关于解释堆栈跟踪的 throw
和 throw new
之间的区别。
根据您的描述,我们有两个选择:
- 您重新抛出异常,
RunAsync
Task
因该异常而失败
- 您没有重新抛出异常,
RunAsync
Task
正常完成(捕获的异常打破了 while
循环,因此方法退出)。
对于第一种情况,Service Fabric Stateless Service RunAsync doc 进一步详细说明了遇到异常时的行为,即源自 FabricException
的异常将导致重新启动,而其他异常则是有意或意外的服务中止以及让它停止。
从逻辑上讲,正常完成意味着服务已成功完成执行并将按照 Service Fabric Reliable Services Lifecycle doc.
关闭
昨天发现的一些东西让我意识到我很可能仍然缺少关于 C# 的基本花絮。
我有一个无状态 Service Fabric 应用程序。我在主 while 循环周围有一个 try-catch。如果我在这个循环中抛出一个异常,它就会跳出 while 循环并且服务有效地停止。如果我将 throw
添加到 catch 子句,服务将重新启动。
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;
}
}
谁能解释这是为什么,或者告诉我在哪里可以得到答案?我找不到任何可以解释此行为的内容。
编辑:它不是 Is there a difference between "throw" and "throw ex"? 的副本,因为据我所知,它没有解释我的问题,为什么函数又是 运行。该主题更多地是关于解释堆栈跟踪的 throw
和 throw new
之间的区别。
根据您的描述,我们有两个选择:
- 您重新抛出异常,
RunAsync
Task
因该异常而失败 - 您没有重新抛出异常,
RunAsync
Task
正常完成(捕获的异常打破了while
循环,因此方法退出)。
对于第一种情况,Service Fabric Stateless Service RunAsync doc 进一步详细说明了遇到异常时的行为,即源自 FabricException
的异常将导致重新启动,而其他异常则是有意或意外的服务中止以及让它停止。
从逻辑上讲,正常完成意味着服务已成功完成执行并将按照 Service Fabric Reliable Services Lifecycle doc.
关闭