Обработка исключений в методах asyn c void - PullRequest
0 голосов
/ 18 июня 2020

Следующий код C# приводит к необработанному исключению. Почему исключение не перехватывается оператором catch? Может ли кто-нибудь объяснить внутреннее устройство обработки исключений методов async void? Есть ли способ перехватить исключения для методов async void?

    static async void RunThings()
    {
        throw new Exception();
        await Task.Delay(500);
    }

    static void Main(string[] args)
    {
        try
        {
            RunThings();
            Task.CompletedTask.Wait();
        }
        catch
        {
            Console.WriteLine("Caught!");
        }
    }

1 Ответ

2 голосов
/ 18 июня 2020

Почему исключение не улавливается оператором catch?

Потому что это async void.

Может кто-нибудь объяснить внутренние особенности обработки исключений асинхронных c пустых методов?

Task в методе async Task представляет выполнение этого метода. Поэтому, когда метод async Task вызывает исключение, это исключение используется для сбоя задачи.

void - это неестественный тип возврата для методов async. Помимо прочего, негде разместить исключение, созданное методом async void. Таким образом, любые исключения, выброшенные из метода async void, будут возникать непосредственно в SynchronizationContext, который был активен, когда метод async void начал выполняться.

Есть ли способ перехватить исключения для asyn c void методы?

Вы можете предоставить свои собственные SynchronizationContext.

Но тогда исключения в обработчиках событий не будут обрабатываться?

Поведение «вызывать исключения для SynchronizationContext» предназначено для имитации работы исключений для обработчиков событий. Например, для приложения GUI исключение, вызванное событием GUI (Button_Click), будет перенаправлено тому же обработчику ошибок приложения верхнего уровня (Application.DispatcherUnhandledException) независимо от того, обработчик событий GUI (Button_Click) ) является синхронным или асинхронным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...