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
columns: string[] // Affected columns
value?: unknown // Duplicate value

constructor(constraint: string, columns?: string[], value?: unknown)
}

ForeignKeyError

Thrown when a FOREIGN KEY constraint is violated.

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

constructor(constraint: string, table: string, column: 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, detail?: 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'
): DatabaseError

Parameters:

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

Returns: Typed DatabaseError or subclass

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)
}
}

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'

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

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"
// }