Apariencia
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 Result | API 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>porFindError<T>yGetReason<T>porFindReason<T>. - Sustituye
TreeQuerypor las extensiones de Error o por TreeTraversal. - Usa
IReasonNodepara abarcar razones dinámicas y tipadas;Reasonsolo 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.