Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中投内接球#_C#_Throw_Rethrow - Fatal编程技术网

C# 在C中投内接球#

C# 在C中投内接球#,c#,throw,rethrow,C#,Throw,Rethrow,昨天发现了一些东西,让我意识到我很可能仍然错过了关于C#的基本花絮 我有一个无状态服务结构应用程序。我试着在主while环上接球。如果我在这个循环中抛出一个异常,它将跳出while循环,服务将有效地停止。如果我在catch子句中添加一个throw,服务将重新启动 protected override async Task RunAsync(CancellationToken cancellationToken) { try {

昨天发现了一些东西,让我意识到我很可能仍然错过了关于C#的基本花絮

我有一个无状态服务结构应用程序。我试着在主while环上接球。如果我在这个循环中抛出一个异常,它将跳出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;
        }
    }
有人能解释一下为什么会这样,或者告诉我在哪里可以得到答案吗?我找不到任何解释这种行为的东西


编辑:它不是的副本,因为据我所知,它没有解释我的问题,为什么要再次运行该函数。该主题更多地解释了堆栈跟踪的
throw
throw new
之间的区别

根据您的描述,我们有两种选择:

  • 您重新显示异常,并且
    RunAsync
    任务因该异常而失败
  • 您不需要重新抛出异常,
    RunAsync
    任务
    已顺利完成(捕获的异常在
    循环时中断了
    ,因此方法退出)
  • 对于第一种情况,本文进一步详细说明了遇到异常时的行为,即从
    FabriceException
    派生的异常将导致重新启动,而其他异常则是预期的或意外的服务中止,并导致其停止


    在逻辑上,优雅的完成意味着服务成功地完成了执行,并将按照关闭。

    可能的重复。您可以发布不同的替代代码吗?目前很难说你在问什么。也许这会有所帮助:我的假设是,程序的这一部分再次被包装在某个地方,抛出异常被转换为带故障退出,而实际返回则被呈现为正常关闭(由于异常中断了
    while
    循环之外的执行线程,因此该方法退出)“我很可能仍然缺少关于C#的基本花絮。”,我不会称之为“基本的”,异步代码的异常处理看起来很简单,但它非常微妙,实际上并不琐碎。啊,那就更有意义了。我想我误解了抛出和重新抛出在C#中的作用。难怪我找不到满意的答案。谢谢!