Я пытаюсь создать обработку ошибок для моего приложения. Я создал базовый класс с именем AppError. У меня есть конкретные классы ошибок, расширяющие класс AppError. Например, класс BadInput для состояния ошибки 400. Я использую instanceof для распознавания класса объекта. Но obj instanceof BadInput всегда возвращает false, даже если я создаю экземпляр класса BadInput. Мой код выглядит следующим образом:
приложение-error.ts
export class AppError {
constructor (public originalError?: any) {
console.log(originalError);
}
}
дурные-input.ts
import { AppError } from './app-error';
export class BadInput extends AppError {
constructor (public originalError?: any) {
super(originalError);
}
}
Данные-service.service.ts
// import statements
export class DataService {
private _baseUrl = 'dummy.com'
constructor(private _http: Http) {}
get http() {
return this._http;
}
makePostRequest (urlSubpath: string, body: Object) {
return this._http.post(this._baseUrl + urlSubpath, JSON.stringify(body), this.getOptions())
.map (response => response.json());
}
protected handleError(error: Response) {
if (error.status === 400) {
return Observable.throw (new BadInput (error.json()));
} else if (error.status === 404) {
return Observable.throw (new NotFoundError ());
} else if (error.status === 500) {
console.log ('in 500 handling...');
return Observable.throw (new BadInput (error.json()));
}
return Observable.throw (new AppError (error.json()));
}
}
Обратите внимание на строку return Observable.throw (новый BadInput (error.json ())); пару раз в handleError ()
otp.service.ts
// import statements
@Injectable()
export class OtpCheckerService extends DataService {
constructor(http: Http) {
super(http);
}
check(body) {
return super.makePostRequest('Api/VerifyMobile', body)
.catch(this.handleError);
}
}
otp.component.ts
// Only providing required code
submit() {
const body = {
UserId: this._user.id,
OTP: this.otp.value
};
this._spinner.show ();
this._otpCheckerService.check(body).subscribe(
response => {
this._user.isSignedIn = true;
this._router.navigate(['/checkout']);
},
(error: AppError) => {
this._spinner.hide();
if (error instanceof BadInput) {
console.log ('handling bad input..');
this._isOtpWrong = true;
} else {
throw error;
}
},
() => {
this._spinner.hide();
}
);
}
Я пропустил некоторый код для краткости, но если вам нужно, я могу поместить код здесь.
Обновление 1:
Я изменил submit () в otp.component.ts, чтобы посмотреть, не участвует ли мой глобальный обработчик ошибок в этом. Обновленный метод отправки выглядит следующим образом:
submit() {
const body = {
UserId: this._user.id,
OTP: this.otp.value
};
this._spinner.show ();
this._otpCheckerService.check(body).subscribe(
response => {
this._user.isSignedIn = true;
this._router.navigate(['/checkout']);
},
(error: AppError) => {
this._spinner.hide();
if (error instanceof BadInput) {
console.log ('handling bad input..');
this._isOtpWrong = true;
} else if (error instanceof AppError) {
console.log ('handling app error..');
} else {
throw error;
}
},
() => {
this._spinner.hide();
}
);
}
Обратите внимание, я проверяю Ошибка экземпляра AppError . Это также возвращает ложь. И глобальный обработчик ошибок обрабатывает ошибку. Мой глобальный обработчик ошибок выглядит следующим образом:
import { ErrorHandler } from '@angular/core';
export class AppErrorHandler implements ErrorHandler {
handleError(error: any): void {
console.log(error);
alert ('Sorry. An unexpected error occured. Our engineers are fixing it.');
}
}