簡體   English   中英

捕獲任務中引發的異常?

[英]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框架是否無法以這種方式捕獲異常? 如何在Maintry/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM