C# 处理异步匿名方法错误

C# 处理异步匿名方法错误,c#,.net,asynchronous,anonymous-methods,C#,.net,Asynchronous,Anonymous Methods,我有一个基本框架,用于一般性地处理错误;然而,当错误发生时,我似乎没有在我的框架中捕捉到它。以下代码是我试图实现的目标的简化版本: class Program { static void Main(string[] args) { RunMethod<decimal>(() => { decimal x = 0; decimal y = 1 / x;

我有一个基本框架,用于一般性地处理错误;然而,当错误发生时,我似乎没有在我的框架中捕捉到它。以下代码是我试图实现的目标的简化版本:

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;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
RunMethod(()=>
{
十进制x=0;
十进制y=1/x;
返回y;
});
}
专用静态异步任务运行方法(Func方法)
{
尝试
{
var结果=等待运行方法(方法);
返回结果;
}
捕获(除零例外)
{
System.Diagnostics.Debug.WriteLine(“错误”);
返回默认值(T);
}
}
专用静态异步任务TryRunningMehod(Func方法)
{
var returnValue=wait Task.Run(方法);
返回值;
}
}
当您运行上面的代码时,会发生什么情况?它会在除以零的过程中崩溃。我试图让它写一条调试消息并继续

我只标记了未处理异常的中断

我的例外设置:

IDE中断时的外观:


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

只需将代码更改为:

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

你“标记”的东西并不是你想象的那样。我的水晶球显示您勾选了Debug>Exceptions对话框中的抛出复选框。这会使调试器在抛出异常时在到达catch块之前停止。你需要解决这段代码中真正的错误,你的程序在任务完成之前就结束了。我不止一次检查过我没有这个标志。在本例中,当任务结束时基本上是不相关的,因为它是错误的-这是测试的目的(它所基于的代码确实等待函数),您没有等待
RunMethod
完成,这意味着您的应用程序在除以零的时候已经终止了。这没有什么区别。您的意思是什么?运行此命令将导致执行进入异常处理程序。如果您编写了
Console.WriteLine
而不是'System.Diagnostics.Debug.WriteLine',您将在控制台中看到一条消息。事实上,该消息将出现在VisualStudio的输出窗口中。我已经运行了它,但它没有。明确地说,我希望代码进入catch块,然后返回,而不会导致错误。就目前情况而言,调试器正在以零错误向潜水员发出警报,不是吗?运行此代码确实会进入异常处理程序并打印消息。您尝试了什么,发生了什么?是的,这就是异常发生时发生的情况。然后执行移到异常处理程序。
    catch (DivideByZeroException ex)
    {
        Console.WriteLine("Error");
        return default(T);
    }