У меня есть хороший линейный код, включенный async
await
, который возвращает значение.Большая часть моего кода идет по этому шаблону:
var a = await Foo1();
Bar1(a);
Bar2(a);
Bar3(a);
var b = await Foo2(a);
Bar4(a,b);
Но тогда мне нужно отловить исключение из функции async
.
try
{
var a = await Foo1();
}
catch(MyException me)
{
throw me;
}
Bar1(a);
Bar2(a);
Bar3(a);
try
{
var b = await Foo2(a);
}
catch(MyException2 me2)
{
throw me2;
}
Bar4(a,b);
Это определяет переменную внутри try
и теперь это ошибка компиляции.Если я хочу сохранить линейный код, тогда try
должен охватывать слишком много строк, что, на мой взгляд, не очень хорошая практика?Теперь он создает пирамиду с отступом:
try
{
var a = await Foo1();
Bar1(a);
Bar2(a);
Bar3(a);
try
{
var b = await Foo2(a);
Bar4(a, b);
}
catch (MyException2 me2)
{
throw me2;
}
}
catch (MyException me)
{
throw me;
}
Таким образом, чтобы try
только эту строку и поддерживать линейный код, мне нужно сначала переместить объявление в пустое состояние, а затем присвоить в try
, чтобы сохранитьпеременная на внешней области видимости.
A a;
try
{
a = await Foo1();
}
catch (MyException me)
{
throw me;
}
Bar1(a);
Bar2(a);
Bar3(a);
B b;
try
{
b = await Foo2(a);
}
catch (MyException2 me2)
{
throw me2;
}
Bar4(a, b);
Теперь она вроде линейная.Я должен прекратить использовать var
тоже, потому что я больше не могу сделать вывод из async
метода.Я чувствую, что C # предоставил бы более элегантное решение, которое мне не хватает?