typescript - วิธีระบุข้อผิดพลาดหลายรายการใน JavaScript promises?
ฉันกำลังพยายามใช้พรอมิสส์เป็นครั้งแรก แต่ฉันกำลังมีปัญหาในการหาวิธีที่ดีที่สุดในการจัดการข้อผิดพลาด/ข้อยกเว้นหลายประเภท
ฉันกำลังดำเนินการสร้างระบบเข้าสู่ระบบผู้ใช้ ซึ่งการทราบว่าการเข้าสู่ระบบล้มเหลวเพราะชื่อผู้ใช้ไม่มีอยู่ รหัสผ่านไม่ถูกต้อง หรือเกิดข้อผิดพลาดอื่น ๆ จะเป็นประโยชน์
ด้านล่างเป็นส่วนหนึ่งของบริการล็อกอินของฉันซึ่งใช้ AWS Cognito (ส่วนใหญ่ไม่เกี่ยวข้องที่นี่) ใน callback ของ 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; }
}
}
ด้านล่างนี้คือวิธีที่ฉันจัดการกับพรอมิสและข้อยกเว้นในลูกค้า ฉันสามารถระบุสาเหตุของความผิดพลาดได้ แต่การใช้การตรวจสอบ instance ของข้อยกเว้นดูเหมือนจะแปลกเล็กน้อยและทำให้ฉันสงสัยในประโยชน์ของมันที่นี่
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 หรือไม่? ฉันคิดว่า enum จะดีกว่า แต่จริงๆ แล้วฉันกำลังสร้างระบบข้อผิดพลาดของตัวเองขึ้นมาใหม่ ไลบรารี/เฟรมเวิร์กจัดการเรื่องนี้อย่างไร?
โดยอุดมคติแล้วฉันต้องการความปลอดภัยของชนิดข้อมูลให้มากที่สุดเท่าที่จะเป็นไปได้ และฉันไม่ค่อยอยาก โยน หรือ ปฏิเสธ สตริงเพราะว่านั่นไม่ได้ช่วยอะไรลูกค้าเท่าไหร่