Skip to main content

Error Handling

Multi-database error parsing with typed error classes.

Error Classes

DatabaseError

Base error class for all database errors.

class DatabaseError extends Error {
code: string
detail?: string
originalError?: unknown

constructor(
message: string,
options?: {
code?: string
detail?: string
originalError?: unknown
}
)

toJSON(): Record<string, unknown>
}

UniqueConstraintError

Thrown when a UNIQUE constraint is violated.

class UniqueConstraintError extends DatabaseError {
constraint: string // Constraint name
table: string // Table name
columns: string[] // Affected columns

constructor(constraint: string, table: string, columns: string[])
}

ForeignKeyError

Thrown when a FOREIGN KEY constraint is violated.

class ForeignKeyError extends DatabaseError {
constraint: string
table: string
referencedTable: string

constructor(constraint: string, table: string, referencedTable: string)
}

NotFoundError

Thrown when an entity is not found.

class NotFoundError extends DatabaseError {
entity?: string
id?: unknown

constructor(message?: string, entity?: string, id?: unknown)
}

BadRequestError

Thrown for invalid requests.

class BadRequestError extends DatabaseError {
constructor(message: string)
}

NotNullError

Thrown when a NOT NULL constraint is violated.

class NotNullError extends DatabaseError {
column: string

constructor(column: string)
}

CheckConstraintError

Thrown when a CHECK constraint is violated.

class CheckConstraintError extends DatabaseError {
constraint: string

constructor(constraint: string)
}

Error Parsing

parseDatabaseError

Parse raw database errors into typed errors.

function parseDatabaseError(error: unknown, dialect: 'postgres' | 'mysql' | 'sqlite' | 'mssql'): DatabaseError

Parameters:

  • error - Raw error from database driver
  • dialect - Database dialect

Returns: Typed DatabaseError or subclass

Example:

// PostgreSQL example
try {
await db.insertInto('users').values({ email: 'test@test.com' }).execute()
} catch (error) {
const dbError = parseDatabaseError(error, 'postgres')

if (dbError instanceof UniqueConstraintError) {
console.log('Duplicate:', dbError.constraint)
console.log('Columns:', dbError.columns)
}
}

// MSSQL example
try {
await db.insertInto('users').values({ email: 'duplicate@example.com' }).execute()
} catch (error) {
const dbError = parseDatabaseError(error, 'mssql')
if (dbError instanceof UniqueConstraintError) {
console.log('Duplicate entry:', dbError.constraint)
}
}

Error Codes

Unified Error Code System

// Database errors
'DB_CONNECTION_FAILED'
'DB_QUERY_FAILED'
'DB_TRANSACTION_FAILED'
'DB_TIMEOUT'
'DB_POOL_EXHAUSTED'
'DB_UNKNOWN'

// Validation errors
'VALIDATION_UNIQUE_VIOLATION'
'VALIDATION_FOREIGN_KEY_VIOLATION'
'VALIDATION_NOT_NULL_VIOLATION'
'VALIDATION_CHECK_VIOLATION'
'VALIDATION_FAILED'

// Resource errors
'RESOURCE_NOT_FOUND'
'RESOURCE_BAD_REQUEST'
'RESOURCE_ALREADY_EXISTS'
'RESOURCE_CONFLICT'

// Migration errors
'MIGRATION_UP_FAILED'
'MIGRATION_DOWN_FAILED'
'MIGRATION_VALIDATION_FAILED'

// Plugin errors
'PLUGIN_INIT_FAILED'
'PLUGIN_VALIDATION_FAILED'
'PLUGIN_DESTROY_FAILED'
'PLUGIN_HOOK_FAILED'
'PLUGIN_CONFLICT'
'PLUGIN_DEPENDENCY_MISSING'
'SOFT_DELETE_ERROR'
'RECORD_NOT_DELETED'
'TIMESTAMPS_ERROR'
'TIMESTAMP_COLUMN_MISSING'

// Audit errors
'AUDIT_LOG_FAILED'
'AUDIT_RESTORE_FAILED'
'AUDIT_QUERY_FAILED'
'AUDIT_TABLE_MISSING'
'AUDIT_ERROR'
'AUDIT_RESTORE_ERROR'
'AUDIT_MISSING_VALUES'

// Config errors
'CONFIG_VALIDATION_FAILED'
'CONFIG_MISSING_REQUIRED'
'CONFIG_INVALID_VALUE'
'CONFIG_FILE_NOT_FOUND'
'CONFIG_PARSE_ERROR'

// FileSystem errors
'FS_READ_FAILED'
'FS_WRITE_FAILED'
'FS_DELETE_FAILED'
'FS_PERMISSION_DENIED'
'FS_NOT_FOUND'
'FS_ALREADY_EXISTS'

// Network errors
'NETWORK_TIMEOUT'
'NETWORK_CONNECTION_REFUSED'
'NETWORK_HOST_UNREACHABLE'
'NETWORK_UNKNOWN'

Database-Specific Codes

PostgreSQL

CodeError Type
23505UniqueConstraintError
23503ForeignKeyError
23502NotNullError
23514CheckConstraintError

MySQL

CodeError Type
ER_DUP_ENTRYUniqueConstraintError
ER_NO_REFERENCED_ROWForeignKeyError
ER_BAD_NULL_ERRORNotNullError

SQLite

Message ContainsError Type
UNIQUE constraintUniqueConstraintError
FOREIGN KEY constraintForeignKeyError
NOT NULL constraintNotNullError

MSSQL

Error CodeError TypeDescription
2627, 2601UniqueConstraintErrorUnique constraint violation
515NotNullErrorNOT NULL constraint violation
547ForeignKeyErrorForeign key constraint violation

JSON Serialization

All errors support JSON serialization:

const error = new UniqueConstraintError('users_email_key', ['email'], 'test@test.com')

console.log(JSON.stringify(error.toJSON()))
// {
// "name": "UniqueConstraintError",
// "message": "Unique constraint violation",
// "code": "VALIDATION_UNIQUE_VIOLATION",
// "constraint": "users_email_key",
// "columns": ["email"],
// "value": "test@test.com"
// }