[英]Catching exceptions thrown within a Task?
我正在嘗試在我創建的Task
捕獲異常,但是它們從未“冒泡”到運行該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) { }
}
}
當我在DoSomething
中拋出FooExcepion
時,Visual Studio通知我未捕獲到異常。 從這個SO答案和這個MSDN頁面,我認為這些異常只會“冒泡”到myTask.Wait()
並隨后被捕獲。 盡管似乎並非如此。
此SCCEE的項目設置的目標是.NET 4.5.2,而我正在使用Visual Studio2015。我的目標.NET框架是否無法以這種方式捕獲異常? 如何在Main
的try/catch
塊中捕獲FooException
?
編輯:我已經更改了SSCCE以使用async
/ await
模式代替Task.Wait
。
點擊Continue
按鈕,您將看到異常確實被外部try / catch捕獲。 因為異常越過中的內臟Task
異常被認為是“用戶Unhanded”,但Task
通過將任務到HANDELS為您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
,它將為您解包裝異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.