Skip to content

Migrar las consultas de Result a Error ​

Result representa el estado de la operación y expone su error raíz. La búsqueda del diagnóstico pertenece a platform.errors.

Acceso seguro ​

csharp
using System;
using Greencore.Platform.Errors;
using Greencore.Platform.Errors.Extensions;
using Greencore.Platform.Nodes;
using Greencore.Platform.Results;

var resultado = Result<int>.Fail(
    Error.Create("Cantidad inválida.").WithReason("Debe ser mayor que cero."));

if (resultado.IsError)
{
    Error error = resultado.Error;
    if (error.TryGetReason<IReasonNode>(out var razon))
        Console.WriteLine(razon.Message);

    foreach (var hoja in error.ReasonsOfType<IReasonNode>())
        Console.WriteLine(hoja.Message);
}

Leer resultado.Error en un éxito lanza InvalidOperationException. La propiedad es no nula en un fallo; no uses resultado.Error?.FindReason<T>() para proteger un éxito, porque el getter se evalúa antes del operador condicional.

Equivalencias ​

En las siguientes equivalencias, comprueba primero resultado.IsError.

API anterior sobre ResultAPI actual
resultado.GetError<T>()resultado.Error.FindError<T>()
resultado.HasError<T>()resultado.Error.HasError<T>()
resultado.TryGetError<T>(out var error)resultado.Error.TryGetError<T>(out var error)
resultado.GetReason<T>()resultado.Error.FindReason<T>()
resultado.HasReason<T>()resultado.Error.HasReason<T>()
resultado.TryGetReason<T>(out var reason)resultado.Error.TryGetReason<T>(out var reason)
resultado.ErrorsOfType<T>()resultado.Error.ErrorsOfType<T>()
resultado.ReasonsOfType<T>()resultado.Error.ReasonsOfType<T>()
resultado.NodesOfType<T>()resultado.Error.NodesOfType<T>()

Conserva includeNonTerminal: true cuando necesites nodos con hijos. FindError y FindReason devuelven null si no hay coincidencia; no son getters que lancen por ausencia.

Condiciones compactas ​

csharp
bool contieneExcepcion = resultado.IsError
    && resultado.Error.HasError<ExceptionError>();

if (resultado.IsError
    && resultado.Error.TryGetReason<IReasonNode>(out var causa))
{
    Console.WriteLine(causa.Message);
}

El cortocircuito evita leer Error en un éxito. Para trabajar exclusivamente con el diagnóstico, pásalo a un método que reciba Error:

csharp
if (resultado.IsError)
    MostrarCausas(resultado.Error);

static void MostrarCausas(Error error)
{
    foreach (var causa in error.ReasonsOfType<IReasonNode>())
        Console.WriteLine(causa.Message);
}

Ese método solo necesita Errors y Nodes. El llamador decide cómo gestionar el estado de Result.

Compatibilidad y errores frecuentes ​

  • Importa Greencore.Platform.Errors.Extensions; importar solo Results no habilita las consultas.
  • Sustituye GetError<T> por FindError<T> y GetReason<T> por FindReason<T>.
  • Sustituye TreeQuery por las extensiones de Error o por TreeTraversal.
  • Usa IReasonNode para abarcar razones dinámicas y tipadas; Reason solo abarca la familia dinámica.
  • ErrorsOfType<Error>() puede estar vacío aunque exista un error con razones: su filtro predeterminado es de hojas.
  • Para metadatos utiliza node.Metadata.Values.TryGetValue(...).
  • En resultados con error tipado, puedes acceder a las propiedades del tipo conocido directamente desde Error; reserva la búsqueda para explorar el árbol.

Vuelve al índice de consultas para comparar todos los métodos.

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