Apariencia
Diagnósticos de procesos
ProcessError describe un fallo de ejecución y conserva sus causas mediante razones tipadas.
Qué necesitas
Referencia Greencore.Platform.Processes e importa su namespace. Identifica la operación y la causa detectada: una excepción, un timeout, una cancelación u otra clasificación. No hace falta crear clases propias para las razones estándar.
Razones disponibles
| Tipo | Código | Datos específicos |
|---|---|---|
ProcessExceptionReason | process.exception | Excepción original |
ProcessTimeoutReason | process.timeout | Duración opcional |
ProcessCanceledReason | process.canceled | Token de cancelación |
ProcessUnavailableReason | process.unavailable | Mensaje |
Todas declaran ProcessError como padre. Su código clasifica la causa; no establece automáticamente un estado HTTP.
Construir e interpretar
csharp
using Greencore.Platform.Processes;
var error = ProcessError.Create("No se pudo descargar el libro", "excel.download");
error.AddTimeoutReason(TimeSpan.FromSeconds(30), "La descarga superó el tiempo permitido");
foreach (var timeout in error.Reasons.OfType<ProcessTimeoutReason>())
Console.WriteLine($"{error.Operation}: {timeout.Code}, límite {timeout.Timeout}");AddExceptionReason(exception) conserva el objeto original, incluida su pila y excepción interna. AddCanceledReason(token) conserva el token. Estos métodos registran lo ocurrido: no cancelan operaciones ni inician temporizadores.
Extender una operación
Una raíz propia admite razones exclusivas y las razones estándar:
csharp
using Greencore.Platform.Processes;
var error = new ExcelReadError();
error.AddReason(new WorksheetMissingReason("Clientes"));
public sealed class ExcelReadError : ProcessError
{
public ExcelReadError() : base("No se pudo leer el libro", "excel.read") { }
}
public sealed class WorksheetMissingReason : ProcessReason<ExcelReadError, WorksheetMissingReason>
{
public string SheetName { get; }
public WorksheetMissingReason(string sheetName) : base("excel.sheet_missing", $"No existe la hoja '{sheetName}'")
{
SheetName = sheetName;
}
}En un fallo diferente, la misma raíz puede usar AddExceptionReason(exception) o AddTimeoutReason(...). Una razón personalizada declara su padre en ProcessReason<TParent, TSelf>. Para una causa reutilizable en cualquier proceso, deriva de ProcessReason<TSelf>.
Ventaja frente a composición libre
Los consumidores identifican una cancelación o un timeout sin comparar mensajes. La información específica tiene propiedades con tipos conocidos. Los métodos de conveniencia evitan repetir la construcción de las razones habituales.
La aplicación decide qué hacer con cada clasificación. Registrar un timeout no implica que un reintento sea seguro.
Continúa con lectura y escritura de Excel o con la comparación de modelos.