Handling Prisma Errors

1. Catching PrismaClientKnownRequestError

import { Prisma } from "@prisma/client";
try { await prisma.user.create({ data }); }
catch (e) {
  if (e instanceof Prisma.PrismaClientKnownRequestError) {
    if (e.code === "P2002") return { error: "Email already exists" };
  }
  throw e;
}
AspectDetail
ClassPrismaClientKnownRequestError
codeP2xxx error code
metaExtra context (target field, etc.)

2. Handling Unique Constraint Errors

CodeMeaning
P2002Unique constraint violation
meta.targetField(s) that conflicted

3. Handling Foreign Key Errors

CodeMeaning
P2003FK constraint failed
P2014Required relation violation
P2025Record to connect not found

4. Handling Record Not Found Errors

APIDetail
findUniqueReturns null
findUniqueOrThrowThrows P2025
updateThrows P2025 if not found

5. Handling Validation Errors

ClassDetail
PrismaClientValidationErrorInvalid query shape (TS-checked at compile)
CauseOften dynamic input bypassed types

6. Implementing Error Logging

prisma.$on("error", (e) => logger.error({ msg: e.message, target: e.target }));
SourceDetail
log: ["error"]Emit error events
SentryCapture with context

7. Using Error Codes

CodeMeaning
P2000Value too long
P2002Unique constraint
P2003Foreign key constraint
P2024Pool timeout
P2025Record not found
P2034Transaction conflict (retry)

8. Implementing Custom Error Classes

export class NotFoundError extends Error {
  constructor(public entity: string, public id: string | number) {
    super(`${entity} ${id} not found`);
  }
}
BenefitDetail
Domain layerDecouple from Prisma codes
HTTP mappingSingle translator at boundary

9. Handling Transaction Errors

CodeDetail
P2028Transaction API error
P2034Serialization failure — retry
TipWrap interactive tx in retry loop

10. Implementing Error Recovery Strategies

StrategyWhen
RetryTransient (P1001, P2024, P2034)
Compensating actionSaga / outbox patterns
Fail fastValidation / 4xx errors