Skip to content

Estructura libre de razones ​

En Greencore, un error describe qué operación falló y conserva sus causas como un árbol. Error es una raíz concreta que permite composición libre y Reason representa una causa que puede contener otras causas. Ambos exponen un mensaje (Message), causas (Reasons) y metadatos (Metadata).

Composición básica de errores ​

Un error puede comenzar con un único mensaje: Error.Create("No se pudo importar el archivo."). Error.Create(...) devuelve un Error, de modo que puedes encadenar los métodos de composición. También puedes construirlo con new Error(mensaje). Para explicar el fallo, agrega causas. Las siguientes variantes construyen el mismo árbol.

Composición no fluida ​

Crea los nodos en variables y agrégalos a su padre con llamadas independientes:

csharp
using Greencore.Platform.Errors;

var error = new Error("No se pudo importar el archivo de clientes.");
var fila = new Reason("La fila 42 contiene datos inválidos.");
var nombre = new Reason("El nombre es obligatorio.");
var correo = new Reason("El correo no tiene un formato válido.");

fila.AddReason(nombre);
fila.AddReason(correo);
error.AddReason(fila);

Reasons es una colección de solo lectura. Agrega causas mediante los métodos de composición, no con Reasons.Add(...).

Composición fluida ​

Encadena las llamadas para construir el árbol en una expresión:

csharp
using Greencore.Platform.Errors;
using Greencore.Platform.Errors.Extensions;

var error = Error.Create("No se pudo importar el archivo de clientes.")
    .AddReason("La fila 42 contiene datos inválidos.")
        .WithReason("El nombre es obligatorio.")
        .WithReason("El correo no tiene un formato válido.")
    .Root();
MétodoDevuelveUso
AddReason(...)La causa agregadaContinuar dentro de esa causa
WithReason(...)El nodo receptorAgregar causas hermanas
WithReasons(...)El nodo receptorAgregar varias causas de una vez
WithMetadata(...)El nodo receptorAsociar datos al nodo actual
Root()La raíz como ErrorRecuperar el error desde una causa vinculada

Dos llamadas consecutivas a AddReason(...) crean niveles anidados. Dos llamadas a WithReason(...) agregan causas al mismo nodo. La indentación ayuda a leer el código, pero los valores devueltos determinan la estructura.

Mostrar errores con y sin opciones ​

Sin opciones ​

Usando cualquiera de las variantes anteriores:

csharp
Console.WriteLine(error.ToString());
text
No se pudo importar el archivo de clientes.
└── La fila 42 contiene datos inválidos.
    ├── El nombre es obligatorio.
    └── El correo no tiene un formato válido.

Por defecto, ToString() muestra todo el árbol con caracteres Unicode y sin metadatos.

Con metadatos y opciones ​

Los metadatos conservan datos como el código, el archivo o la fila afectada. Cada llamada a WithMetadata(...) modifica el nodo que la recibe:

csharp
using Greencore.Platform.Errors;
using Greencore.Platform.Errors.Extensions;
using Greencore.Platform.Errors.Trees;

var errorConMetadatos = Error.Create("No se pudo importar el archivo de clientes.")
    .WithMetadata("Code", "IMPORT_FAILED")
    .WithMetadata("File", "customers.csv")
    .AddReason("La fila 42 contiene datos inválidos.")
        .WithMetadata("Row", 42)
        .WithReason(new Reason("El nombre es obligatorio.")
            .WithMetadata("Property", "Name"))
        .WithReason(new Reason("El correo no tiene un formato válido.")
            .WithMetadata("Property", "Email"))
    .Root();

Console.WriteLine(errorConMetadatos.ToString(new TreeFormatOptions
{
    IncludeMetadata = true,
    UseUnicode = true
}));
text
No se pudo importar el archivo de clientes. [Code=IMPORT_FAILED, File=customers.csv]
└── La fila 42 contiene datos inválidos. [Row=42]
    ├── El nombre es obligatorio. [Property=Name]
    └── El correo no tiene un formato válido. [Property=Email]

Llamar a errorConMetadatos.ToString() sin opciones muestra el mismo árbol sin los datos entre corchetes. Los metadatos siguen disponibles en Metadata: las opciones solo cambian la representación.

OpciónValor predeterminadoEfecto
IncludeMetadatafalseMuestra los metadatos junto a cada nodo
UseUnicodetrueUsa ramas Unicode; con false, utiliza ASCII
IndentSize4Define el ancho de cada nivel; mínimo 2
MaxDepthnullLimita la profundidad; 0 muestra la raíz y un indicador si hay causas omitidas

Continuar ​

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