Skip to content

Buscar errores por tipo ​

Importa los tipos y las extensiones:

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

FindError, HasError y TryGetError ​

MétodoRetornoRestricción
FindError<T>()T?T : Error
HasError<T>()boolT : Error
TryGetError<T>(out T? error)boolT : Error

Los tres incluyen la raíz y los errores descendientes, aunque tengan razones. Se detienen en la primera coincidencia. Si solo necesitas comprobar presencia, usa HasError; si también necesitas los datos, TryGetError evita hacer dos búsquedas.

Ejemplo completo: errores combinados ​

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

var stock = new StockError("SKU-01");
stock.WithReason("No quedan unidades.");
var pago = new PaymentError("PAY-42");
var error = ErrorComposer.Combine(stock, pago);

Console.WriteLine(error.HasError<StockError>()); // True.

var primero = error.FindError<StockError>();
Console.WriteLine(primero?.ProductCode); // SKU-01.

if (error.TryGetError<PaymentError>(out var encontrado))
    Console.WriteLine(encontrado.PaymentCode); // PAY-42.

Console.WriteLine(error.FindError<ExceptionError>() is null); // True.
Console.WriteLine(ReferenceEquals(error.FindError<Error>(), error)); // True.

public sealed class StockError(string productCode) : Error("Stock insuficiente.")
{
    public string ProductCode { get; } = productCode;
}

public sealed class PaymentError(string paymentCode) : Error("Pago rechazado.")
{
    public string PaymentCode { get; } = paymentCode;
}

ErrorComposer.Combine conserva el orden y las referencias a los errores recibidos. Si hay varios errores distintos, crea una raíz agregada interna. No necesitas conocer su tipo: consulta los tipos públicos de tus errores. Si solo queda una instancia distinta, devuelve esa misma instancia.

FindError<Error>() devuelve siempre la raíz proporcionada. Para buscar un error descendiente excluyendo la raíz puedes usar FindReason<Error>(), o enumerar descendientes con TreeTraversal.

Obtener una excepción conservada ​

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

var original = new InvalidOperationException("La conexión está cerrada.");
Error error = new ExceptionError(original);

if (error.TryGetError<ExceptionError>(out var fallo))
{
    Exception exception = fallo.Exception;
    Console.WriteLine(ReferenceEquals(exception, original)); // True.
}

La búsqueda encuentra nodos ExceptionError, no excepciones .NET directamente: FindError<InvalidOperationException>() no cumple la restricción genérica. Tampoco recorre automáticamente InnerException; después de encontrar el nodo, examina su propiedad Exception.

Primera coincidencia o todas ​

FindError<T>() puede encontrar un error con razones. Para enumerar todos los errores del mismo tipo, incluidos esos nodos intermedios:

csharp
foreach (var encontrado in error.ErrorsOfType<Error>(includeNonTerminal: true))
    Console.WriteLine(encontrado.Message);

Sin el argumento, la enumeración devuelve solo errores sin hijos. Continúa con enumerar coincidencias.

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