How to catch a Firebase Auth specific exceptions

前端 未结 16 2248
慢半拍i
慢半拍i 2020-11-28 04:37

Using Firebase, how do I catch a specific exception and tell the user gracefully about it? E.g :

FirebaseAuthInvalidCredentialsException: The email ad

相关标签:
16条回答
  • 2020-11-28 05:08

    I tried another solutions but didn't like them.

    What about this:

    if (!task.isSuccessful()) {
    
        Exception exc = task.getException();
    
        if (exc.getMessage().contains("The email address is badly formatted.")) {
            etUser.setError(getString(R.string.error_wrong_email));
            etUser.requestFocus();
        }
        else
        if (exc.getMessage().contains("There is no user record corresponding to this identifier. The user may have been deleted.")) {
            etUser.setError(getString(R.string.error_user_not_exist));
            etUser.requestFocus();
        }
        else
        if (exc.getMessage().contains("The password is invalid or the user does not have a password")) {
            etPass.setError(getString(R.string.error_wrong_password));
            etPass.requestFocus();
        }
    
    
        Log.w(TAG, "signInWithEmail:failed", task.getException());
    
    
        Toast.makeText(AuthActivity.this, R.string.auth_failed,
                Toast.LENGTH_SHORT).show();
    }
    
    0 讨论(0)
  • 2020-11-28 05:08
        try {
                throw task.getException();
            } catch(FirebaseAuthException e) {
               switch (e.getErrorCode()){
                            case "ERROR_WEAK_PASSWORD":
                          Toast.makeText(this, "The given password is invalid.", Toast.LENGTH_SHORT).show();
                                 break;
                          //and other
                        }
            }
    

    error codes: https://stackoverflow.com/a/38244409/2425851

    0 讨论(0)
  • 2020-11-28 05:10

    If you are sending upstream messages from user to cloud, implement firebase callback functions onMessageSent and onSendError to check the status of upstream messages. In error cases, onSendError returns a SendException with an error code.

    For example, if the client attempts to send more messages after the 20-message limit is reached, it returns SendException#ERROR_TOO_MANY_MESSAGES.

    0 讨论(0)
  • 2020-11-28 05:12

    If you simply want display a message to the user this works. Simple and Elegant:

    if (!task.isSuccessful()) {
        Log.w(TAG, "signInWithEmail:failed", task.getException());
        Toast.makeText(LoginActivity.this, "User Authentication Failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
    }
    

    It appears that the .getMessage() method converts the exception to a usable format for us already and all we have to do is display that somewhere to the user.

    (This is my first comment, constructive criticism please)

    0 讨论(0)
  • 2020-11-28 05:12

    To catch a firebase Exception is easy, you should add .addOnFailureListener after you add .addOnCompleteListener like this:

     private void login_user(String email, String password) {
    
        mAuth.signInWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
               if(task.isSuccessful()){
                   Intent intent = new Intent(getApplicationContext(),MainActivity.class);
                   startActivity(intent);
                   finish();
               }if(!task.isSuccessful()){
    
    
                    // To know The Excepton 
                    //Toast.makeText(LoginActivity.this, ""+task.getException(), Toast.LENGTH_LONG).show();
    
               }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                if( e instanceof FirebaseAuthInvalidUserException){
                    Toast.makeText(LoginActivity.this, "This User Not Found , Create A New Account", Toast.LENGTH_SHORT).show();
                }
                if( e instanceof FirebaseAuthInvalidCredentialsException){
                    Toast.makeText(LoginActivity.this, "The Password Is Invalid, Please Try Valid Password", Toast.LENGTH_SHORT).show();
                }
                if(e instanceof FirebaseNetworkException){
                    Toast.makeText(LoginActivity.this, "Please Check Your Connection", Toast.LENGTH_SHORT).show();
                }
            }
        });
    
    0 讨论(0)
  • 2020-11-28 05:19

    you can use this:

    mAuth.getCurrentUser().linkWithCredential(authCredential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            Log.d(TAG, "linkWithCredential:success");
                        } else {
                            Log.w(TAG, "linkWithCredential:failure", task.getException());
                            Toast.makeText(getApplicationContext(), "Authentication failed. " + task.getException().toString, Toast.LENGTH_SHORT).show();
    
                        }
    
                        // ...
                    }
                });
    
    0 讨论(0)
提交回复
热议问题