Надёжный вызов асинхронного метода: обнаружение проблем с обработкой исключений

Возврат Task внутри try не перехватывает его последующее асинхронное падение. Нужно дождаться операции через await внутри того же try/catch.

Короткий ответ

Что ответить на собеседовании

Возврат Task внутри try не перехватывает его последующее асинхронное падение. Нужно дождаться операции через await внутри того же try/catch.

Подробный разбор

Ответ с пояснениями

Условие

Имеется интерфейс I с асинхронным методом DoThings() и класс F, который пытается вызвать его «безопасно», то есть без проброса исключений наружу. В текущей реализации присутствует несколько ошибок, их необходимо выявить.

class SafeExecutor
{
    public interface IService
    {
        Task DoThings();
    }

    public Task DoThingsSafely(IService service)
    {
        try
        {
            return service.DoThings();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Handle exception: {ex.Message}");
            return Task.CompletedTask;
        }
    }
}

Ответ

Возврат Task внутри try не перехватывает его последующее асинхронное падение. Нужно дождаться операции через await внутри того же try/catch.

public async Task DoThingsSafely(IService service)
{
    try
    {
        await service.DoThings();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Handle exception: {ex.Message}");
    }
}

Теперь обрабатываются и синхронный бросок при вызове, и ошибка завершения Task. Исходная версия ловит только первый случай. Политику отмены нужно определить отдельно: обычно OperationCanceledException не подавляют, а передают вызывающему коду. Обработчик/логирование тоже не должны неожиданно выбрасывать исключения, если контракт обещает безопасное завершение.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее