Questo non è qualcosa che farei normalmente, ma ho una situazione in cui un codice legacy esistente viene riutilizzato in una nuova applicazione. Il codice è condiviso e deve essere utilizzato sia dalla legacy che dalla nuova applicazione. L'applicazione legacy è un'applicazione di reporting e gli errori vengono segnalati come messaggi in modo diverso rispetto ai messaggi informativi nell'interfaccia utente. La nuova applicazione esegue effettivamente azioni basate su questi calcoli: quindi gli errori sono ora fondamentali per l'esecuzione del programma.
Abbiamo centinaia di metodi di business logic che ordinano una persona in una serie di bucket, in cui i bucket sono contenuti in un dizionario (la chiave è il numero bucket, il valore è true se si trovano in quel bucket in base al calcolo): / p>
public Dictionary<int, bool> Calculation(IPerson person, out string message)
{
try
{
var buckets = new Dictionary<int, bool>();
// Do logic to determine what buckets the person is in
// message is used by the legacy application UI...can be set to anything
}
catch(Exception)
{
message = "Some non-consistent error message";
}
return buckets;
}
In ogni metodo c'è un blocco di eccezioni onnicomprensive che inghiotte l'eccezione (sì ... lo so).
Ai fini di questi calcoli un errore di eccezione non significa che l'intero calcolo debba essere scartato: se c'è un'eccezione e la persona non finisce in tutti i bucket, non dovremmo preoccuparci. Il messaggio viene utilizzato per comunicare all'interfaccia utente che per questa persona l'intero calcolo potrebbe non essere stato completato e che è considerato sufficiente. Il messaggio può contenere anche informazioni non di errore ... non è specificamente un messaggio di errore e quando c'è un errore non c'è testo coerente da cercare.
Con la nuova applicazione, potenzialmente vorremmo intraprendere un percorso di esecuzione diverso se ci fosse un'eccezione: per lo meno vogliamo rilevare e visualizzare costantemente gli errori nell'interfaccia utente in modo ovvio e distinto, non solo come qualunque testo è stato assegnato alla variabile del messaggio. Vorremmo anche registrare i dettagli delle eccezioni in questa nuova applicazione.
Non sono autorizzato ad apportare modifiche che alterano il comportamento dell'applicazione legacy, ma posso ridefinire le firme del metodo. Sto proponendo che l'eccezione sia catturata com'è ora, ma restituirla è un parametro out:
public Dictionary<int, bool> Calculation(IPerson person, out string message, out Exception exception)
{
try
{
var buckets = new Dictionary<int, bool>();
// Do logic to determine what buckets the person is in
// message is used by the legacy application UI...can be set to anything
}
catch(Exception ex)
{
message = "Some non-consistent error message";
exception = ex;
}
return buckets;
}
So che questo è totalmente non standard e assolutamente non il modo in cui le eccezioni sono destinate ad essere utilizzate, ma in una situazione in cui vogliamo segnalare che si è verificata un'eccezione gestita ... perché non restituire l'eccezione stessa? tieni presente che non posso modificare il comportamento dell'applicazione precedente.
Pensieri? Questa è ancora una pessima idea? C'è un modo migliore per farlo dato i vincoli?