Я хотел бы иметь общую логику try / catch / finally в функции, подобной декоратору, которая может обернуть функцию или метод класса. Рассмотрим сценарий:
Class MyClass {
void someMethodA() {
doSomeInitialWork();
try {
doSomething();
} catch (err) {
throw err;
} finally {
doSomeCleanUpWork();
}
}
void someMethodB() {
doSomeInitialWork();
try {
doSomethingElse();
} catch (err) {
throw err;
} finally {
doSomeCleanUpWork();
}
}
}
Так далее и тому подобное. Уникальные части каждого метода - это просто try
тело. Если у меня есть несколько методов, некоторые из которых требуют одинаковой логики, есть ли хороший способ избежать избыточного кода?
В идеале это может быть синтаксис вроде:
@wrapper
void someMethodA() {
doSomething();
}
@wrapper
void someMethodB() {
doSomethingElse();
}
MyClassInstance.someMethodA(); // call it like this and the wrapper takes care of everything
но я знаю, что это аннотации в Dart, и здесь они не применимы.
ОБНОВЛЕНИЕ
Следуя ответу jamesdlin, я пытаюсь включить решение анонимной функции в сценарий futures / async / await:
Future<dynamic> trySomething(Future<dynamic> Function() callback) async {
doSomeInitialWork();
try {
return await callback();
} catch (err) {
throw err;
} finally {
doSomeCleanUpWork();
}
}
class MyClass {
Future<List<String>> someMethodA() async {
return await trySomething(() async {
return await someApiCall();
});
}
}
Кажется, это работает, но выглядит неаккуратно. Я не уверен, что то, что я делаю в примере async / await, уместно.
void someMethodA() {}
этоFuture<List<String>> someMethodA() async {return await blah();}
. Я не уверен, как сейчас выглядит анонимная функция и как обернуть тело. 17.02.2021