Apariencia
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étodo | Retorno | Restricción |
|---|---|---|
FindError<T>() | T? | T : Error |
HasError<T>() | bool | T : Error |
TryGetError<T>(out T? error) | bool | T : 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.