How to catch exception in flutter?

This is my exception class. Exception class has been implemented by the abstract exception class of flutter. Am I missing something?

class FetchDataException implements Exception { final _message; FetchDataException([this._message]); String toString() { if (_message == null) return "Exception"; return "Exception: $_message"; } } void loginUser(String email, String password) { _data .userLogin(email, password) .then((user) => _view.onLoginComplete(user)) .catchError((onError) => { print('error caught'); _view.onLoginError(); }); } Future < User > userLogin(email, password) async { Map body = { 'username': email, 'password': password }; http.Response response = await http.post(apiUrl, body: body); final responseBody = json.decode(response.body); final statusCode = response.statusCode; if (statusCode != HTTP_200_OK || responseBody == null) { throw new FetchDataException( "An error occured : [Status Code : $statusCode]"); } return new User.fromMap(responseBody); } 

CatchError doesn't catch the error when the status is not 200. In short error caught is not printed.

4 Answers

Try

void loginUser(String email, String password) async { try { var user = await _data .userLogin(email, password); _view.onLoginComplete(user); }); } on FetchDataException catch(e) { print('error caught: $e'); _view.onLoginError(); } } 

catchError is sometimes a bit tricky to get right. With async/await you can use try/catch like with sync code and it is usually much easier to get right.

2

Let's say this is your function which throws an exception:

Future<void> foo() async { throw Exception('FooException'); } 

You can either use try-catch block or catchError on the Future since both do the same thing.

  • Using try-catch

    try { await foo(); } on Exception catch (e) { print(e); // Only catches an exception of type `Exception`. } catch (e) { print(e); // Catches all types of `Exception` and `Error`. } 
  • Use catchError

    await foo().catchError(print); 

I was trying to find this answer when got to this page, hope it helps:

Basicly i was just trying to catch an error message from a method, but i was calling

throw Exception("message") 

And in "catchError" i was getting "Exception: message" instead of "message".

catchError( (error) => print(error) ); 

fixed with the return in the above reference

Future < User > userLogin(email, password) async { try { Map body = { 'username': email, 'password': password }; http.Response response = await http.post(apiUrl, body: body); final responseBody = json.decode(response.body); final statusCode = response.statusCode; if (statusCode != HTTP_200_OK || responseBody == null) { throw new FetchDataException( "An error occured : [Status Code : $statusCode]"); } return new User.fromMap(responseBody); } catch (e){ print(e.toString()); } 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like