我不确定这种错误处理和抽象是否以错误的方式完成。
Future<void> _refresh() {
return Future(() => throw someError)
.catchError((error) {
// maybe do something here
throw abstractedError; //or even the same error
});
能够在其他地方相应地使用它:
// in a widget/another place
void doSomething() {
_refresh()
.then((_) => bla())
.catchError((error) {
//showSomeAlert() or handleSomething()
});
}
答案 0 :(得分:1)
您的解决方案应该可以工作(简单地throw
是另一个例外),但是更富有表现力的方法可能是使用Future.error
:
Future<void> someApi() {
return Future(() {
throw FirstError();
}).catchError((error, stackTrace) {
print("inner: $error");
// although `throw SecondError()` has the same effect.
return Future.error(SecondError());
});
}
然后使用
someApi()
.then((val) { print("success"); })
.catchError((error, stackTrace) {
// error is SecondError
print("outer: $error");
});
您可以在以下位置使用它:https://dartpad.dartlang.org/8fef76c5ba1c76a23042025097ed3e0a
答案 1 :(得分:0)
在flutter框架中,我们具有catch函数的描述:
- 处理此[Future]发出的错误。
- 这是“ catch”块的异步等效项。 ... 将来的catchError(Function onError,{bool test(Object error)});
在链接期货时,我建议不要使用:
throw error;
,而是使用:
return Future.error(SecondError());
这是因为,如果您链接一个未来并希望使用catchError Future来捕获错误,则会出现以下问题。
Future<void> _refresh() {
return throw Exception("Exception");
}
void main() {
_refresh() // .then((_) => print("bla"))
.catchError(() => print("not able to be reached"));
}
您将收到错误未捕获的异常:异常:异常。
使用RX(通常)时,这是相似的,而不是扔掉,而是向您发送一条Sigle.error(或任何其他可观察到的错误)。
TLDR:
在使用期货并将其链接(包括catchError)时,请使用 Future.error(Exception(“ Exception”))处理错误。
如果您正在使用投掷,请确保尝试抓或未来(()->投掷...) >
答案 2 :(得分:0)
要捕获Error
,您需要添加导入dart:async
;首先,然后使用try
.. catch
块包装代码。
try {
Http.Response response = await Http.get(
url,
headers: headers,
)
.timeout(const Duration(seconds: 1));
} on TimeoutException catch (e) {
print('Timeout');
} on Error catch (e) {
print('Error: $e');
}