How can i fix my app which been crashed by my custom exception. i think

Viewed 23

so intentionally passes wrong parameters in my code to get the user not found exception. but when my code catches the error in the bloc and tries to emit the failure state the app crashes and no state is emitted

custom Exception

repository_function cubit function this is the call stack i get below

_handleBeginFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:986)
<asynchronous gap> (Unknown Source:0)
scheduleFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:810)
scheduleFrameCallback (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:536)
scheduleTick (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\ticker.dart:265)
_tick (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\ticker.dart:254)
_invokeFrameCallback (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1175)
<closure> (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1079)
handleBeginFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1077)
_handleBeginFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:994)
<asynchronous gap> (Unknown Source:0)
scheduleFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:810)
scheduleFrameCallback (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:536)
scheduleTick (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\ticker.dart:265)
_tick (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\ticker.dart:254)
_invokeFrameCallback (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1175)
<closure> (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1079)
handleBeginFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1077)
_handleBeginFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:994)
<asynchronous gap> (Unknown Source:0)
scheduleFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:810)
scheduleFrameCallback (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:536)
scheduleTick (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\ticker.dart:265)
_tick (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\ticker.dart:254)
_invokeFrameCallback (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1175)
<closure> (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1079)
handleBeginFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1077)
_handleBeginFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:994)
<asynchronous gap> (Unknown Source:0)
scheduleFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:810)
scheduleFrameCallback (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:536)
scheduleTick (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\ticker.dart:265)
_tick (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\ticker.dart:254)
_invokeFrameCallback (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1175)
<closure> (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1079)
handleBeginFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:1077)
_handleBeginFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:994)
<asynchronous gap> (Unknown Source:0)
scheduleFrame (c:\src\flutter\flutter\packages\flutter\lib\src\scheduler\binding.dart:810)

that all i can provide..

1 Answers

You cant throw an error in a catch block. You would again have to put a try block around it. If you throw an exception of course your app crashes.

I would do this:

enum SignInFailures {
   userNotFound,
   wrongPassword,
   ...
}

An then inside of the catch block:

on FirebaseAuthException catch(e) {
   switch(e.code) {
      case "user-not-found":
        return SignInFailures.userNotFound,
      ...
   }
}

To make this work, make walkIn() a Future instead of Future<auth.User?> and catch the result:

final result = await walkIn();

if(result is SignInFailures)
{
   return print("Error occured!");
}

print("Success! User UID: ${(result as User).uid}");
Related