import logger from './logger';
export class AppError extends Error {
public readonly statusCode: number;
public readonly isOperational: boolean;
constructor(message: string, statusCode: number, isOperational: boolean = true) {
super(message);
this.statusCode = statusCode;
this.isOperational = isOperational;
Error.captureStackTrace(this, this.constructor);
}
}
export const handleError = (err: Error): void => {
if (err instanceof AppError && err.isOperational) {
logger.error({
message: err.message,
statusCode: err.statusCode,
stack: err.stack
});
} else {
// Unhandled error - application should crash
logger.error({
message: 'Unhandled error',
error: err.message,
stack: err.stack
});
process.exit(1);
}
};
// Global uncaught exception handler
process.on('uncaughtException', (err) => {
logger.error('UNCAUGHT EXCEPTION! Shutting down...');
logger.error(err.name, err.message, err.stack);
process.exit(1);
});
// Global unhandled rejection handler
process.on('unhandledRejection', (reason) => {
logger.error('UNHANDLED REJECTION! Shutting down...');
logger.error(reason);
process.exit(1);
});