Я знаю, что этот вопрос задавался несколько раз, но я немного смотрю на другой вариант.Обработка исключений в методах async C#
public async Task<string> SomeAsyncMethod(string url)
{
// do some URL validation
if (!valid)
{
throw new Exception("some error");
}
// do async stuff now
return await GetFromUrl(url)
}
// now in caller
public async Task<string> SomeOtherAsyncMethod(string input)
{
var task = SomeAsyncMethod(input);
// there is potential chance that a validation fails and
//exception is thrown even before entering async parts of the called function
// do some independent stuff here
try
{
await task;
}
catch(Exception e)
{
// log error
}
// is the following code correct way to handle exceptions?
if (!task.IsFaulted)
{
return task.Result;
}
// log error from task.Exception
return null;
}
В приведенном выше коде может случиться так, что проверка терпит неудачу, и исключение даже до того, как управление входит асинхронную часть способа. Нужно ли обернуть первый вызов также вокруг блока try..catch? Мой эксперимент показал, что это не полезно. Вместо этого для статуса задачи задано значение Faulted. Поэтому я считаю правильным проверить состояние задачи и соответственно вернуть данные. Может ли C# прокомментировать это?
Действительно ли SomeAsyncMethod() должен быть 'async'? Не можете ли вы просто вернуть GetFromUrl (url); '? – piedar
@piedar .. да, это должно быть асинхронно. Это операция ввода-вывода и, следовательно, нет точки в блочном ожидании. – Gopal
@Gopal: просто возврат значения из 'GetFromUrl (url)' не будет блокироваться. Он просто вернул бы «Задача», этот метод вернулся вместо того, чтобы обернуть задачу в еще одну задачу. Разница заключалась бы в том, что вместо исключения, попадающего в оболочку задачи, вызывающий элемент 'SomeOtherAsyncMethod' увидит это. Что лучше зависит от ваших предпочтений: упаковка реализации SomeAsyncMethod в задаче упрощает обработку исключений в вызывающем, но при незначительном расходе дополнительных накладных расходов (задача, конечный автомат метода и т. Д.). Либо мне кажется хорошо. –