export enum ERR_CODES { // General UnknownErr, Unimplemented, Other, // System/Timeout errors Canceled, Timeout, RemoteServiceErr, OutOfMemory, // Validation/Input errors InvalidAction, BadConfig, InvalidArgument, OutOfRange, // Access errors PermissionDenied, Unauthenticated, // Entity errors EntityExists, EntityNotFound, Outdated, // Not error by itself, but adds some additional // information to the error in error stack ErrClarification, }; export const getErrCode = (name: keyof typeof ERR_CODES): ERR_CODES | undefined => { return ERR_CODES[name]; } export abstract class Err extends Error { abstract code: ERR_CODES; get_name() { return this.constructor.name }; } export const getErrStack = (err: Error): Error[] => { const errStack: Error[] = [] let thisErr: Error = err while (thisErr.cause) { errStack.push(thisErr) if (thisErr.cause instanceof Error) thisErr = thisErr.cause } return errStack } // =============================== // == Some useful error classes == // =============================== export class BadConfigErr extends Err { code = ERR_CODES.BadConfig }