Я изучаю асинхронный режим и жду. Следующая «уловка» не перехватывает исключение, выброшенное в DoTask. Предполагая, что DoTask - это сторонний метод, который я не могу изменить, как мне исправить его, чтобы предложение catch перехватило исключение?

private static async Task DoTask()
{
    await Task.Delay(10000);
    throw new Exception("Exception!");
}


public static void Main(string[] args)
{
    try
    {
        Task.Run(async () => await DoTask());
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

    Console.WriteLine("End");
    Console.ReadKey();
}
2
Silly Dude 10 Окт 2021 в 07:26

3 ответа

Лучший ответ

Захват AggregateException будет возможен, если вы используете async/await - поэтому причина, по которой вы его не поймаете, - это не ожидание Task.Run внутри main - он просто немедленно экранирует предложение try.

1
Yom B 10 Окт 2021 в 04:40

Как насчет этого упрощения:

public static async Task Main(string[] args)
{
    try
    {
        await DoTask();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

    Console.WriteLine("End");
    Console.ReadKey();
}
3
Enigmativity 10 Окт 2021 в 04:46

Я разобрался - мне нужно дождаться завершения задачи. После того, как я добавил «Task.WaitAll (task);», он перехватил исключение.

private static async Task DoTask()
{
    await Task.Delay(10000);
    throw new Exception("Exception!");
}


public static void Main(string[] args)
{
    try
    {
        Task task = DoTask();
        Task.WaitAll(task);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.InnerException.Message);
    }

    Console.WriteLine("End");
    Console.ReadKey();
}
1
Silly Dude 10 Окт 2021 в 04:54