扔进C#里面的Catch

昨天找到的东西让我意识到我很可能仍然缺少关于C#的基本花絮.

我有一个无状态服务结构应用程序.我在主循环中有一个尝试捕获.如果我在这个循环中抛出一个异常,它会跳出while循环并且服务有效地停止.如果我向catch子句添加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;
        }
    }

有人可以解释为什么这是或指示我到哪里可以得到答案?我找不到任何可以解释这种行为的东西.

编辑:它不是Is there a difference between “throw” and “throw ex”?的副本,因为据我所知,它没有解释我的问题,为什么函数再次运行.该主题更多的是解释抛出和抛出新的堆栈跟踪之间的区别.

最佳答案
根据您的描述,我们有两个选择:

>您重新抛出异常,RunAsync任务因该异常而失败
>您不会重新抛出异常并且RunAsync任务正常完成(捕获的异常打破了while循环,因此该方法退出).

对于第一种情况,Service Fabric Stateless Service RunAsync doc进一步详细说明了遇到异常时的行为,即从FabricException派生的异常将导致重启,而其他异常是意图或意外的服务中止并导致其停止.

优雅完成逻辑上意味着服务已成功完成执行,并将按照Service Fabric Reliable Services Lifecycle doc关闭.

转载注明原文:扔进C#里面的Catch - 代码日志