如何在Flutter中传递(在方法堆栈中)异常?

时间:2019-02-28 12:46:45

标签: exception dart flutter

我正在尝试制作一个使用“ HTTP Get”通信来登录Flutter的REST应用。虽然我没有问题导入“ http / http.dart”包和 运行http类方法时,我在Dart / Flutter中遇到了异常处理问题。我创建了一种方法来调用http,但是如果 由于任何原因导致连接断开,它自然会返回“ SocketException”异常。我用相同的方法处理异常没有问题 谁发出了get请求,但是如果我尝试将其在调用方方法堆栈中传递给父方法,我将无法再次捕获它。我发现了 “ rethrow”关键字,但是到目前为止,在成功抛出异常方面没有成功。下面是我在代码中使用的一些方法,包括登录方法和调用方方法:

static Future<JsonEnvelop> loginUser(String email, String passwd) async {

    List<int> content = Utf8Encoder().convert(passwd);
    crypto.Digest digest = crypto.md5.convert(content);

    String url = _baseUrl + _loginUrl + email + "/" + digest.toString();

    http.Response response;
    try {
      response = await http.get(url);
    } on SocketException catch(e) {
      rethrow;
    }

    if(response != null && response.statusCode == 200) {
      return JsonEnvelop.fromJson(json.decode(response.body));
    } else {
      throw Exception('Failed to login');
    }
  }

void onVerifyCodeBtnPressed(BuildContext context) {
    if (_formKey.currentState.validate()) {
      String email = _emailController.text;
      String passwd = _passwdController.text;

      Future<JsonEnvelop> envelop;
      try {
        envelop = RemoteUserServices.loginUser(
            email, passwd);
      } on SocketException {
        throw Exception('Internet is down');
      }
      Scaffold.of(context).showSnackBar(SnackBar(content: Text('Login to your account')));

      envelop.then((JsonEnvelop envelop) {
        showDialog(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              title: new Text("Login"),
              content: new Text("Login Successful"),
              actions: <Widget>[
                new FlatButton(
                  child: new Text("OK"),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                )
              ],
            );
          }
        );
      });
    } else {
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: new Text("Missing data"),
            content: new Text("Type your email and password in the fields"),
            actions: <Widget>[
              new FlatButton(
                child: new Text("OK"),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              )
            ],
          );
        }
      );
    }
  }

在这种情况下可能是什么问题?我希望创建一个对话框,警告用户互联网断开。

2 个答案:

答案 0 :(得分:0)

而不是使用重新抛出或引发新异常。返回Future.error()

/dev/stdin

答案 1 :(得分:0)

Future<bool> methodThatErrorsOnCall() { return Future.error(); } ... ... methodThatErrorsOnCall.catchError((e) { print('I want to show a dialog: ${e.error}'); // callback fires. return false; // Future completes with false }) / try(异步代码例外)仅在具有catch的函数中起作用,否则您需要传递async回调或使用onError放在返回的.catchError(...)上,显然很难正确处理。

Future