1
resposta

catchError retorna mais de uma mensagem.

Olá pessoal, como estão todos?

Gostaria de saber se poderiam me ajudar, por favor, referente ao seguinte cenário:

Todos os tratamentos para catchError encadeados implementei exatamente como explicado pelo professor Alex, e os conferi em commit, também iguais, contudo, sempre que exibido um erro como por exemplo de tempo excedido, antes deste ou outro também específico, é exibida também a mensagem "Unkown Error", isso sempre antes dos outros.

Gostaria de saber se passaram por isso, e se conseguiram atuar com alguma solução.

Abaixo segue meu código para um melhor entendimento.

TransactionForm

Future<Transaction> _send(Transaction transactionCreated, String password,
      BuildContext context) async {
    setState(() {
      _sending = true;
    });
    final Transaction transaction =
        await _webClient.save(transactionCreated, password).catchError((e) {
      _showFailureMessage(context, message: e.message);
    }, test: (e) => e is HttpException).catchError((e) {
      _showFailureMessage(context,
          message: 'Timeout submitting the transaction');
    }, test: (e) => e is TimeoutException).catchError((e) {
      _showFailureMessage(context);
    }).whenComplete(() {
      setState(() {
        _sending = false;
      });
    });
    return transaction;
  }

TransactionWebClient

Future<Transaction> save(Transaction transaction, String password) async {
    final String transactionJson = jsonEncode(transaction.toJson());

    final Response response = await client.post(baseUrl,
        headers: {
          'Content-type': 'application/json',
          'password': password,
        },
        body: transactionJson);

    if (response.statusCode == 200) {
      return Transaction.fromJson(jsonDecode(response.body));
    }
    throw HttpException(_getMessage(response.statusCode));
  }

  String? _getMessage(int statusCode) {
    if (_statusCodeResponses.containsKey(statusCode)) {
      return _statusCodeResponses[statusCode];
    }
    return 'Unknown error';
  }

  static final Map<int, String> _statusCodeResponses = {
    400: 'There was an error submitting transaction',
    401: 'Authentication failed',
    409: 'Transaction already exists'
  };
}

class HttpException implements Exception {
  final String? message;

  HttpException(this.message);
}

Desde já, agradeço imensamente. Marcio.

1 resposta

Olá Marcio, tudo bem? Espero que esteja se divertindo aprendendo Flutter!

Sobre a sua pergunta, é possível que a mensagem "Unknown error" esteja sendo exibida porque o código não encontrou uma mensagem específica para o status code retornado pela API. Uma solução para isso seria adicionar uma mensagem padrão para todos os status codes que não estão sendo tratados pelo mapa _statusCodeResponses.

Você pode fazer isso adicionando o seguinte código no método _getMessage da classe TransactionWebClient:

if (statusCode >= 400 && statusCode < 500) {
  return 'Client error';
} else if (statusCode >= 500 && statusCode < 600) {
  return 'Server error';
}

Dessa forma, caso o status code retornado pela API não esteja no mapa _statusCodeResponses, a mensagem "Client error" será exibida para status codes entre 400 e 499, e "Server error" para status codes entre 500 e 599.

Espero ter ajudado e bons estudos!