【问题标题】:Handling asynchronous anonymous method errors处理异步匿名方法错误
【发布时间】:2015-08-19 03:35:21
【问题描述】:

我有一个基本框架,旨在通用地处理错误;但是,当错误发生时,我似乎没有在我的框架中捕获它。以下代码是我想要实现的简化版本:

class Program
{
    static void Main(string[] args)
    {
        RunMethod<decimal>(() =>
            {
                decimal x = 0;
                decimal y = 1 / x;
                return y;
            });

    }

    private static async Task<T> RunMethod<T>(Func<T> method)
    {
        try
        {
            var result = await TryRunningMehod<T>(method);
            return result;
        }
        catch (DivideByZeroException ex)
        {
            System.Diagnostics.Debug.WriteLine("Error");
            return default(T);
        }
    }

    private static async Task<T> TryRunningMehod<T>(Func<T> method)
    {
        var returnValue = await Task.Run<T>(method);
        return returnValue;
    }
}

当您运行上述代码时会发生什么情况,它会在除以零时崩溃。我正在尝试让它写一条调试消息并继续。

我只标记了未处理的异常。

我的例外设置:

IDE 崩溃时的样子:

【问题讨论】:

  • 无论你“标记”什么,都不是你想的那样。我的水晶球说您在“调试”>“例外”对话框中勾选了“抛出”复选框。这使得调试器在抛出异常时停止,然后才能到达 catch 块。您需要解决此代码中的真正错误,您的程序在任务完成之前结束。
  • 我不止一次检查过我没有那个标志。在这个例子中,任务结束的时间基本上是无关紧要的,因为它会出错——这是测试的目的(它所基于的代码确实等待函数)
  • 您没有等待RunMethod 完成,这意味着您的应用程序在您除以零时已经终止。

标签: c# .net asynchronous anonymous-methods


【解决方案1】:

您永远不会等待RunMethod 完成执行,因此应用程序没有机会捕获和处理异常。它已经完成并处于清理阶段。

只需将代码更改为:

RunMethod<decimal>(() =>
        {
            decimal x = 0;
            decimal y = 1 / x;
            return y;
        }).Wait();

异常处理程序将按预期工作。

事实上,编译器会对此发出警告。 ReSharper 等工具也会抱怨并标记调用。

通过进行此更改,执行将进入异常处理程序。实际上,控制台中不会出现任何内容,但单词 Error 将出现在 Visual Studio 的输出窗口中。

要在控制台中显示错误消息,异常处理程序应更改为:

    catch (DivideByZeroException ex)
    {
        Console.WriteLine("Error");
        return default(T);
    }

【讨论】:

  • 没什么区别
  • 什么意思?运行它会导致执行进入异常处理程序。如果您写的是 Console.WriteLine 而不是 `System.Diagnostics.Debug.WriteLine`,您会在控制台中看到一条消息。实际上,该消息将出现在 Visual Studio 的输出窗口中
  • 我已经运行了它,但它没有。需要明确的是,我希望代码进入 catch 块,然后返回而不会导致错误。就目前而言,调试器在潜水员处因零错误而中断
  • 不是吗?运行此代码确实会进入异常处理程序并打印消息。您尝试了什么,发生了什么?
  • 是的,这就是发生异常时发生的情况。然后执行转移到异常处理程序。
猜你喜欢
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多