Я пытаюсь создать функцию Dart, которая по существу оборачивает другие функции некоторым стандартным кодом обработки ошибок, и в противном случае возвращает значение, возвращаемое исходной функцией. Ключевым требованием является то, что он должен принимать функции с несколькими различными типами возвращаемых данных, избегая при этом дублирования общей логики обработки ошибок для нескольких различных функций. Я нашел один подход, который, кажется, работает с использованием динамического типа, за исключением того, что компилятор не может обнаружить несоответствия типов, поэтому они перехватываются только во время выполнения.
Есть ли лучший способ выполнить то, к чему я стремлюсь, и, в частности, таким образом, чтобы ловить несоответствия типов во время компиляции?
Ниже приведен упрощенный пример моего кода, где функции прекрасно компилируются, но во время выполнения getAString выдаст ошибку Dart Error: Unhandled exception: type 'List<String>' is not a subtype of type 'String'
/// Подпись вызовов функций API
typedef APIFunctionCall = динамическая функция ();
dynamic doWithErrorHandling(APIFunctionCall fn, {retries: 2}) async {
for (int attempts = 0; attempts < retries + 1; attempts++) {
try {
return await fn();
}
on Exception catch (e) {
print(
"This is just an example; actual function does a bunch of more specific error handling.");
}
}
}
Future<String> getAString() async {
// Want a function that can support multiple return types but detect type errors
String doesReturnAString = await doWithErrorHandling(() async => 'hello world'); // This runs fine
String doesntReturnAString = await doWithErrorHandling(() async => <String>['hello', 'world']); // This throws an Error
return doesntReturnAString;
}