Обработка исключения в асинхронном методе

Всем привет, помогите ответить на вопрос:

Пример с неправильной асинхрой, объяснить почему неправильно. // будет ли поймано исключение, выброшенное в методе OtherMethodAsync? Любое или не всякое?

public Task MyMethodAsync()
{
    try
    {
        return OtherMethodAsync();
    }
    catch (Exception ex)
    {
        return;
    }
}

Ответы (1 шт):

Автор решения: PashaPash

С точки зрения вызывающего кода (MyMethodAsync) метод OtherMethodAsync - это просто метод, возвращающий Task

Асинхронность в виде async/await - это детали реализации OtherMethodAsync. Если OtherMethodAsync выбросит исключение при вызове - оно будет поймано. "При вызове" в этом случае означает "до возврата Task".

В случае async использования async/await для реализации OtherMethodAsync - все исключения внутри будут перехвачены и возвращены в виде объекта Task`, так что если вы просто возвращаете Task выше по цепочке вызовов - исключение вы не поймаете, оно будет выброшено только при первой попытке сделать await или получить результат еще каким-то способом.

Async/Await - Best Practices in Asynchronous Programming

When an exception is thrown out of an async Task or async Task method, that exception is captured and placed on the Task object.

Так что общий ответ - зависит от кода в OtherMethodAsync. Хотите ловить все - сделайте MyMethodAsync async, и напишите в нем await.

→ Ссылка