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
| Error | Code | When Thrown |
|---|---|---|
EntityNotFoundError | ENTITY_NOT_FOUND | Entity with given ID doesn't exist |
DuplicateEntityError | DUPLICATE_ENTITY | Unique constraint violation |
ValidationError | VALIDATION_ERROR | Invalid input data |
StorageConnectionError | STORAGE_CONNECTION_ERROR | Database connection failure |
ConcurrencyConflictError | CONCURRENCY_CONFLICT | Transaction conflict |
InvalidGradeError | INVALID_GRADE | Grade is not again, hard, good, or easy |
SessionNotActiveError | SESSION_NOT_ACTIVE | Operation on inactive session |
UndoNotAvailableError | UNDO_NOT_AVAILABLE | No 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
}
}