2021-03-14 09:13:51 +01:00
|
|
|
import {ErrorHandler, Injectable} from '@angular/core';
|
2021-03-15 06:53:33 +01:00
|
|
|
import {LoggingService} from '@app/_services/logging.service';
|
2021-03-14 09:13:51 +01:00
|
|
|
import {HttpErrorResponse} from '@angular/common/http';
|
2021-03-21 14:11:05 +01:00
|
|
|
import {Router} from '@angular/router';
|
2021-03-14 09:13:51 +01:00
|
|
|
|
2021-04-29 19:10:39 +02:00
|
|
|
// A generalized http response error
|
2021-04-29 07:29:54 +02:00
|
|
|
export class HttpError extends Error {
|
2021-04-29 19:10:39 +02:00
|
|
|
public status: number;
|
|
|
|
constructor(message: string, status: number) {
|
2021-04-29 07:29:54 +02:00
|
|
|
super(message);
|
|
|
|
this.status = status;
|
|
|
|
this.name = 'HttpError';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-14 09:13:51 +01:00
|
|
|
@Injectable()
|
|
|
|
export class GlobalErrorHandler extends ErrorHandler {
|
2021-04-29 19:10:39 +02:00
|
|
|
private sentencesForWarningLogging: Array<string> = [];
|
2021-03-14 09:13:51 +01:00
|
|
|
|
2021-03-21 14:11:05 +01:00
|
|
|
constructor(
|
|
|
|
private loggingService: LoggingService,
|
|
|
|
private router: Router
|
|
|
|
) {
|
2021-03-14 09:13:51 +01:00
|
|
|
super();
|
|
|
|
}
|
|
|
|
|
2021-04-29 07:29:54 +02:00
|
|
|
handleError(error: Error): void {
|
2021-03-14 09:13:51 +01:00
|
|
|
this.logError(error);
|
2021-04-29 19:10:39 +02:00
|
|
|
const message: string = error.message ? error.message : error.toString();
|
2021-03-14 09:13:51 +01:00
|
|
|
|
2021-04-29 07:29:54 +02:00
|
|
|
// if (error.status) {
|
|
|
|
// error = new Error(message);
|
|
|
|
// }
|
2021-03-14 09:13:51 +01:00
|
|
|
|
2021-04-29 19:10:39 +02:00
|
|
|
const errorTraceString: string = `Error message:\n${message}.\nStack trace: ${error.stack}`;
|
2021-03-14 09:13:51 +01:00
|
|
|
|
2021-04-29 19:10:39 +02:00
|
|
|
const isWarning: boolean = this.isWarning(errorTraceString);
|
2021-03-14 09:13:51 +01:00
|
|
|
if (isWarning) {
|
|
|
|
this.loggingService.sendWarnLevelMessage(errorTraceString, {error});
|
|
|
|
} else {
|
|
|
|
this.loggingService.sendErrorLevelMessage(errorTraceString, this, {error});
|
|
|
|
}
|
|
|
|
|
|
|
|
throw error;
|
|
|
|
}
|
|
|
|
|
|
|
|
logError(error: any): void {
|
2021-04-29 19:10:39 +02:00
|
|
|
const route: string = this.router.url;
|
2021-03-14 09:13:51 +01:00
|
|
|
if (error instanceof HttpErrorResponse) {
|
|
|
|
this.loggingService.sendErrorLevelMessage(
|
2021-03-21 14:11:05 +01:00
|
|
|
`There was an HTTP error on route ${route}.\n${error.message}.\nStatus code: ${(error as HttpErrorResponse).status}`,
|
|
|
|
this, {error});
|
2021-03-14 09:13:51 +01:00
|
|
|
} else if (error instanceof TypeError) {
|
2021-03-21 14:11:05 +01:00
|
|
|
this.loggingService.sendErrorLevelMessage(`There was a Type error on route ${route}.\n${error.message}`, this, {error});
|
2021-03-14 09:13:51 +01:00
|
|
|
} else if (error instanceof Error) {
|
2021-03-21 14:11:05 +01:00
|
|
|
this.loggingService.sendErrorLevelMessage(`There was a general error on route ${route}.\n${error.message}`, this, {error});
|
2021-03-14 09:13:51 +01:00
|
|
|
} else {
|
2021-03-21 14:11:05 +01:00
|
|
|
this.loggingService.sendErrorLevelMessage(`Nobody threw an error but something happened on route ${route}!`, this, {error});
|
2021-03-14 09:13:51 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private isWarning(errorTraceString: string): boolean {
|
2021-04-29 19:10:39 +02:00
|
|
|
let isWarning: boolean = true;
|
2021-03-14 09:13:51 +01:00
|
|
|
if (errorTraceString.includes('/src/app/')) {
|
|
|
|
isWarning = false;
|
|
|
|
}
|
|
|
|
|
2021-04-29 19:10:39 +02:00
|
|
|
this.sentencesForWarningLogging.forEach((whiteListSentence: string) => {
|
2021-03-14 09:13:51 +01:00
|
|
|
if (errorTraceString.includes(whiteListSentence)) {
|
|
|
|
isWarning = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return isWarning;
|
|
|
|
}
|
|
|
|
}
|