Возврат 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 не подавляют, а передают вызывающему коду. Обработчик/логирование тоже не должны неожиданно выбрасывать исключения, если контракт обещает безопасное завершение.