Skip to content

Manejo de Excepciones

En Fang JS, no necesitas enviar respuestas de error manualmente dentro de un try/catch en cada ruta. El framework proporciona un sistema de excepciones que, al ser lanzadas, son capturadas automáticamente por el motor de Fang para enviar la respuesta HTTP adecuada.

Todas las excepciones de Fang heredan de HttpException. Esta clase extiende el objeto Error nativo de JavaScript, pero añade soporte para códigos de estado HTTP y captura de traza (stack trace).

import { HttpException } from "@fang-js/fang/exceptions";
// Puedes lanzar una excepción genérica
throw new HttpException("Mensaje personalizado", 418);

Fang incluye las excepciones más comunes para que tu código sea más semántico y legible:

400: Bad Request

BadRequestException / InvalidBodyScheme

401: Unauthorized

UnauthorizedException

403: Forbidden

ForbiddenException

404: Not Found

NotFoundException

405: Method Not Allowed

MethodNotAllowedException

409: Conflict

ConflictException

422: Unprocessable Entity

UnprocessableEntityException

429: Too Many Requests

TooManyRequestsException

500: Internal Error

InternalServerErrorException

502: Bad Gateway

BadGatewayException

503: Service Unavailable

ServiceUnavailableException

504: Gateway Timeout

GatewayTimeoutException

@Service
export class UserService extends BaseService {
async findById(ctx: Context, id: string) {
const user = await db.users.find(id);
if (!user) {
// Fang capturará esto y enviará un 404 JSON automáticamente
throw new NotFoundException(`El usuario con ID ${id} no existe`);
}
return user;
}
}

Si tu lógica de negocio requiere errores específicos (como un error de pago o de cuota excedida), puedes extender la clase base fácilmente:

import { HttpException } from "@fang-js/fang/exceptions";
export class PaymentRequiredException extends HttpException {
constructor(message = "Suscripción inactiva") {
super(message, 402);
}
}
// Uso
if (!hasPaid) throw new PaymentRequiredException();

Recuerda que puedes personalizar cómo se ven estas excepciones cuando llegan al cliente configurando el método onError en tu instancia principal de Fang. Por defecto, Fang responde con un objeto JSON que contiene el nombre del error, el mensaje y el estatus.

app.onError((err, ctx) => {
const status = err instanceof HttpException ? err.status : 500;
ctx.json(
{
success: false,
error: err.name,
message: err.message,
},
status,
);
});