我第一次尝试使用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中尽可能避免异常吗?我认为枚举更好,但我真的只是重新发明我自己的错误系统。库/框架如何处理这个问题?
理想情况下,我希望尽可能多的类型安全,我真的不想抛出或拒绝字符串,因为这对客户端没有多大帮助。