Почему исключение не улавливается оператором 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
) ) является синхронным или асинхронным.