如何识别JavaScript承诺中的多个错误?

时间:2018-01-28 01:42:52

标签: javascript typescript exception-handling promise es6-promise

我第一次尝试使用promises但是我找不到处理多种错误/异常类型的最佳方法。

我正在实施用户登录。如果用户名不存在或密码不正确或者是否存在其他错误,则知道失败很有用。

以下是我使用AWS Cognito的登录服务的一部分(这里大部分都不相关)。在onFailure回调中,我选择创建自己的异常。由于我的CognitoAuth类实现了一个Auth接口,我不想将aws错误代码返回给客户端(关注点分离,因此我自己的异常可以被其他提供者使用)。

  public login(loginData: IAuthLoginData): Promise<void> {
    let authenticationDetails = new AuthenticationDetails({
      Username: loginData.email,
      Password: loginData.password
    })

    let cognitoUser = new CognitoUser({
      Username: loginData.email,
      Pool: this.userPool
    })

    return new Promise<void>((resolve, reject) => {
      cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: (session: CognitoUserSession, userTrackingConfirmationNecessary: boolean) => {
          resolve()
        },
        onFailure: (err) => {
          switch (err.code) {
            case 'UserNotFoundException':
              reject(new UserNotFoundError())

            case 'UserNotConfirmedException':
              reject(new UserNotConfirmedError())

            case 'NotAuthorizedException':
              reject(new PasswordIncorrectError())

            default:
              reject(new LoginError())
          }
        }
      })
    })
  }

我遇到的第一个问题是TypeScript异常的丑陋,特别是在创建大量异常时:

export class UserNotFoundError extends Error {
  constructor(message?: string) {
    super(message);

    // restore prototype chain
    const actualProto = new.target.prototype;
    if (Object.setPrototypeOf) { Object.setPrototypeOf(this, actualProto); }
    else { this.__proto__ = new.target.prototype; }
  }
}

以下是我如何处理客户端中的承诺和例外情况。我能够确定错误的原因,但使用异常检查实例似乎有点奇怪,让我怀疑它们的用处。

  private login() {
    this.auth.login({
      email: this.email.value,
      password: this.password.value
    })
    .then(() => {
      this.navCtrl.setRoot(HomePage);
    })
    .catch((err: Error) => {
      if (err instanceof UserNotFoundError)
        this.email.setErrors({
          usernotfound: true
        })
      else if (err instanceof UserNotConfirmedError)
        this.form.setErrors({
          usernotconfirmed: true
        })
      else if (err instanceof PasswordIncorrectError)
        this.password.setErrors({
          passwordincorrect: true
        })
      else
        this.form.setErrors({
          ooops: true
        })
    })
  }

我应该如何正确识别catch方法中出现的错误?我应该在TypeScript中尽可能避免异常吗?我认为枚举更好,但我真的只是重新发明我自己的错误系统。库/框架如何处理这个问题?

理想情况下,我希望尽可能多的类型安全,我真的不想抛出拒绝字符串,因为这对客户端没有多大帮助。

0 个答案:

没有答案