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);
}