Saltar al contenido principal

Tipos de Error

El enum ErrorType clasifica los fallos y mapea directamente a códigos de estado HTTP cuando se usa Vali-Mediator.AspNetCore.

Enum ErrorType

public enum ErrorType
{
None = 0, // Éxito
Validation = 1, // 400 Bad Request
NotFound = 2, // 404 Not Found
Conflict = 3, // 409 Conflict
Unauthorized = 4, // 401 Unauthorized
Forbidden = 5, // 403 Forbidden
Failure = 6, // 500 Internal Server Error
}

Mapeo de Código de Estado HTTP

ErrorTypeHTTP StatusCaso de Uso
None (éxito) en Result<T>200 OKValor retornado
None (éxito) en Result204 No ContentÉxito void
Validation400 Bad RequestValidación de entrada falló
NotFound404 Not FoundRecurso no existe
Conflict409 ConflictDuplicado o conflicto de estado
Unauthorized401 UnauthorizedNo autenticado
Forbidden403 ForbiddenSin autorización para este recurso
Failure500 Internal Server ErrorError inesperado del servidor

Ejemplos de Uso

Validación

public async Task<Result<Guid>> Handle(CreateProductCommand req, CancellationToken ct)
{
if (string.IsNullOrWhiteSpace(req.Name))
{
var errors = new Dictionary<string, IReadOnlyList<string>>
{
{ "Name", new[] { "El nombre del producto es requerido." } }
};
return Result<Guid>.Fail(errors, ErrorType.Validation);
}
// ...
}

NotFound

var product = await _repo.FindByIdAsync(req.Id, ct);
if (product is null)
return Result<ProductDto>.Fail($"Producto '{req.Id}' no encontrado.", ErrorType.NotFound);

Conflict

if (await _repo.ExistsByEmailAsync(req.Email, ct))
return Result<Guid>.Fail($"Ya existe un usuario con el email '{req.Email}'.", ErrorType.Conflict);

Failure (Errores Inesperados)

try
{
var txId = await _paymentGateway.ChargeAsync(req.Amount, req.CardToken, ct);
return Result<string>.Ok(txId);
}
catch (PaymentGatewayException ex)
{
_logger.LogError(ex, "Error de gateway de pago para orden {OrderId}", req.OrderId);
return Result<string>.Fail("El procesamiento del pago falló. Por favor intenta de nuevo.", ErrorType.Failure);
}
tip

Con Vali-Mediator.AspNetCore, no necesitas un switch manual — simplemente llama a result.ToActionResult() y maneja todos los casos automáticamente.