我试图捕捉我创建的Task
内的异常,但他们从来没有“冒出来”#34;从Task
运行到的地方,它们总是被Visual Studio捕获为运行时错误。
这是我创建的用于显示问题的SSCCE
using System;
using System.Threading.Tasks;
namespace ConsoleApplicationSandbox
{
class Program
{
static void Main(string[] args)
{
CreateTheIssue();
Console.ReadLine();
}
public static async void CreateTheIssue()
{
try
{
int val = await ExceptionThrowerClass.DoSomething();
}
catch(Exception ex)
{
Console.Out.WriteLine("Exception of type " + ex.GetType() + " caught, message: " + ex.Message);
}
}
}
public static class ExceptionThrowerClass
{
public static Task<int> DoSomething()
{
return Task.Run(() =>
{
throw new FooException("How exceptional!");
return 1;
});
}
}
public class FooException : Exception
{
public FooException() : base () { }
public FooException(String message) : base(message) { }
public FooException(String message, Exception inner) : base (message, inner) { }
}
}
Visual Studio在FooExcepion
中DoSomething
抛出异常未被捕获时通知我。从this SO answer和this MSDN page开始,我认为例外只会“冒出来”#34;到myTask.Wait()
并随后被抓住。虽然这似乎不是那种情况。
此SCCEE的项目设置针对的是.NET 4.5.2,我使用的是Visual Studio 2015.是否我的目标.NET框架无法以这种方式捕获异常?如何在FooException
内的try/catch
区块内抓取Main
?
编辑:我已将SSCCE更改为使用async
/ await
模式而不是Task.Wait
。
答案 0 :(得分:2)
点击Continue
按钮,您将看到异常确实被外部try / catch捕获。因为异常交叉到了Task
的内部,所以例外情况被认为是&#34;用户无需使用#34;但Task
通过将任务放入Faulted
来为您解决问题州。当您await
或.Wait()
任务时,这将是一个例外。
在编辑之前使用原始方法
try
{
myTask.Wait();
}
catch(AggregateException ex)
{
var innerException = ex.InnerException;
Console.Out.WriteLine("Exception of type " + innerException .GetType() + " caught, message: " + innerException.Message);
}
因为Task会将异常包装到AggregateException
,当你使用await
时,它会为你解开异常。