将来使用catchError捕获错误并抛出另一种类型

时间:2019-04-09 15:24:06

标签: android ios dart flutter

我不确定这种错误处理和抽象是否以错误的方式完成。

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()
  });
}

3 个答案:

答案 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');
  }