Ho una chiamata al metodo ricorsivo. Quando viene lanciata un'eccezione, mi piacerebbe vedere dove è successo lo stack di chiamate ricorsive. Ho un campo che contiene un "percorso" che rappresenta lo stack di ricorsione.C#: gestione delle eccezioni in chiamata ricorsiva
Ora desidero aggiungere le informazioni sul percorso a qualsiasi eccezione che possa essere generata durante la chiamata ricorsiva.
void Recursive(int x)
{
// maintain the recursion path information
path.Push(x);
try
{
// do some stuff and recursively call the method
Recursive(x + 6);
}
catch(Exception ex)
{
if (ex is RecursionException)
{
// The exception is already wrapped
throw;
}
// wrap the exception, this should be done only once.
// save the path and original exception to the wrapper.
throw new RecursionException(path.ToString(), ex);
}
finally
{
// maintain the recursion path information
path.Pop()
}
}
Sembra troppo complicato. Non c'è solo un metodo. Ci sono probabilmente venti o anche più posti in cui ho dovuto scrivere questo codice.
C'è un modo più semplice per implementare questo?
Modifica: Per sottolineare questo: mi piacerebbe avere una situazione molto più semplice in cui non c'è un tale sovraccarico di chiamare in modo ricorsivo il metodo, perché ho molte di queste chiamate ricorsive, non c'è solo un metodo, ci sono un paio di metodi che chiamano ricorsivamente l'un l'altro, che è abbastanza complesso.
Quindi vorrei evitare l'intero blocco try-catch, ma non riesco a vedere alcuna soluzione per questo.
Non è un grosso problema per Eccezioni generate nel mio codice, perché potrebbe includere il percorso dall'inizio. Ma è un problema con ogni altra eccezione.
Edit: Le eccezioni devono essere avvolto in qualsiasi altro codice, non solo quando si chiama il metodo ricorsivo:
try
{
int a = 78/x; // DivisionByZeroExeption
Recursive(x + 6);
this.NullReference.Add(x); // NullReferenceException
}
Quindi avvolgere solo la chiamata per Recusive non funziona.
ci sono molti di questi metodi, con diverse firme, fare cose diverse, l'unica cosa comune è la gestione delle eccezioni.
Qual è la differenza tra il "percorso" e la proprietà del callstack presente su Eccezione? –
Il callstack consiste solo di nomi di metodi, che sono sempre gli stessi. In questo caso, sarebbe "Ricorsivo -> Ricorsivo -> Ricorsivo -> Ricorsivo" che non dice nulla. La ricorsione sta effettivamente scendendo lungo un albero e il percorso rappresenta il percorso verso il ramo corrente in una forma leggibile dall'uomo. –
Fare tutto il lavoro nei metodi che sono passati attraverso Recursive sarebbe racchiuso tra le eccezioni usando il mio metodo esteso, trattare le diverse firme è complicato, sebbene si possa essere in grado di cavarsela usando i generici per specificare i tipi di parametri, ma le firme arbitrarie potrebbero non è possibile senza scrivere sovraccarichi per ogni ... –