Skip to content

Errores estructurados

Un error puede conservar información de proceso, entidad, miembro y causas anidadas. Así puedes decidir por tipo en lugar de interpretar cadenas de texto.

Errores de proceso

TipoEscenario
CanceledProcessErrorCancelación solicitada
TimeoutProcessErrorTiempo de espera agotado
UnauthorizedProcessErrorFalta autenticación
ForbiddenProcessErrorPermiso insuficiente
NotFoundProcessErrorRecurso inexistente
ConflictProcessErrorConflicto con el estado actual
UnavailableProcessErrorDependencia no disponible
ExceptionProcessErrorExcepción capturada con contexto

Son tipos de dominio: no escriben respuestas HTTP ni reintentan operaciones por sí mismos.

Conservar causas

csharp
using Greencore.Platform.Errors;
using Greencore.Platform.Results;

var error = new UnavailableProcessError(
    "El catálogo no está disponible.", "Consultar catálogo");
error.Reasons.Add(new TimeoutProcessError(
    TimeSpan.FromSeconds(2), "El proveedor no respondió.", "Consultar proveedor"));

var resultado = Result<int>.Fail(error);

if (resultado.GetError<TimeoutProcessError>() is { } timeout)
    Console.WriteLine(timeout.Timeout);

foreach (var causa in resultado.ErrorsOfType<Error>())
    Console.WriteLine(causa.Text);

GetError<T>() busca en la raíz y las causas; devuelve null si no encuentra el tipo. HasError<T>() y TryGetError<T>() permiten consultas equivalentes.

ErrorsOfType<T>() devuelve errores terminales por defecto. Usa includeNonTerminal: true para incluir también contenedores coincidentes con el tipo solicitado.

Errores de entidad y miembro

EntityError<TEntity> agrupa los errores de una entidad. EntityInvalidRuleError<TEntity> representa una regla de entidad. EntityMemberError<TEntity, TMember> conserva el miembro seleccionado; RequiredError<TEntity, TMember> y MemberInvalidRuleError<TEntity, TMember> concretan el motivo.

La guía de validación muestra cómo producir este árbol automáticamente.

Excepciones en los límites

Captura únicamente las excepciones que tu aplicación sabe convertir en un fallo esperado. Por ejemplo, un adaptador puede construir ExceptionProcessError con la excepción original, un mensaje y el nombre de la operación. No expongas detalles internos o trazas a usuarios finales sin decidir primero qué información corresponde mostrar.

Uso personal limitado. Uso comercial sujeto a autorización escrita.