My App
LoopKitBackend

Error Handling

Error hierarchy and error codes in LoopKit

Error Hierarchy

All LoopKit errors extend the abstract LoopKitError base class:

abstract class LoopKitError extends Error {
    abstract readonly code: string;
    constructor(message: string, cause?: Error);
}

Error Types

ErrorCodeWhen Thrown
EntityNotFoundErrorENTITY_NOT_FOUNDEntity with given ID doesn't exist
DuplicateEntityErrorDUPLICATE_ENTITYUnique constraint violation
ValidationErrorVALIDATION_ERRORInvalid input data
StorageConnectionErrorSTORAGE_CONNECTION_ERRORDatabase connection failure
ConcurrencyConflictErrorCONCURRENCY_CONFLICTTransaction conflict
InvalidGradeErrorINVALID_GRADEGrade is not again, hard, good, or easy
SessionNotActiveErrorSESSION_NOT_ACTIVEOperation on inactive session
UndoNotAvailableErrorUNDO_NOT_AVAILABLENo review to undo

Error Details

EntityNotFoundError

class EntityNotFoundError extends LoopKitError {
    constructor(entity: string, id: string, cause?: Error);
}
// "Card with id '123' not found"

DuplicateEntityError

class DuplicateEntityError extends LoopKitError {
    constructor(entity: string, detail: string, cause?: Error);
}
// "Duplicate Card: 123"

InvalidGradeError

class InvalidGradeError extends LoopKitError {
    constructor(grade: string);
}
// "Invalid grade: 'excellent'. Must be one of: again, hard, good, easy"

Error Handling Pattern

import { LoopKitError, EntityNotFoundError, ValidationError } from '@loopkit/nestjs';

try {
    await deckService.getDeck('nonexistent');
} catch (error) {
    if (error instanceof EntityNotFoundError) {
        // 404
    } else if (error instanceof ValidationError) {
        // 400
    } else if (error instanceof LoopKitError) {
        // Other LoopKit error — check error.code
        console.error(`LoopKit error [${error.code}]: ${error.message}`);
    } else {
        throw error; // Re-throw unexpected errors
    }
}

On this page