Mam rekurencyjne wywołanie metody. Kiedy zostanie zgłoszony wyjątek, chciałbym zobaczyć, gdzie w rekursywnym stosie wywołań się stało. Mam pole, które zawiera "ścieżkę", która reprezentuje stos rekursji.C#: Obsługa wyjątków w rekursywnym wywołaniu
Teraz chciałbym dodać informacje o ścieżce do każdego wyjątku, który mógłby zostać zgłoszony w wywołaniu rekursywnym.
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()
}
}
To po prostu wygląda na zbyt skomplikowane. Istnieje nie tylko jedna metoda. Prawdopodobnie istnieje dwadzieścia lub nawet więcej miejsc, w których musiałem napisać ten kod.
Czy istnieje prostszy sposób wdrożenia tego?
Edit: Aby to podkreślić: Chciałbym mieć dużo prostszą sytuację, gdzie nie ma takich napowietrznych rekursywnie wywołać metodę, bo mam wiele takich rekurencyjnych wywołań, istnieje nie tylko jedna metoda, istnieje kilka metod rekurencyjnie wywołujących się nawzajem, które są wystarczająco złożone.
Chciałbym więc uniknąć całego bloku try-catch, ale nie widzę na to żadnego rozwiązania.
To nie jest duży problem dla wyjątków wyrzuconych w moim własnym kodzie, ponieważ może zawierać ścieżkę od początku. Ale jest to problem z każdym innym wyjątkiem.
Edit: Wyjątki muszą być opakowane w każdym innym kodem, a nie tylko wtedy, gdy wywołanie metody rekurencyjnej:
try
{
int a = 78/x; // DivisionByZeroExeption
Recursive(x + 6);
this.NullReference.Add(x); // NullReferenceException
}
Więc owijania tylko wezwanie do Recusive nie działa.
Istnieje wiele takich metod, mających różne podpisy, robiąc różne rzeczy, jedyną popularną rzeczą jest obsługa wyjątków.
Jaka jest różnica między "ścieżką" i właściwością "callstack", która występuje w Exception? –
Zestaw wywoławczy składa się tylko z nazw metod, które są zawsze takie same. W tym przypadku byłby to "Rekursywny -> Rekurencyjny -> Rekurencyjny -> Rekurencyjny", który nic nie mówi. Rekurencja faktycznie schodzi do drzewa, a ścieżka reprezentuje ścieżkę do bieżącej gałęzi w postaci czytelnej dla człowieka. –
Wykonanie całej pracy metodami, które są przekazywane do programu Recursive, byłoby zapakowane w wyjątki przy użyciu mojej rozszerzonej metody, obsługa różnych sygnatur jest trudna, chociaż możesz być w stanie uciec z używaniem generycznych do określenia typów parametrów, ale arbitralne podpisy mogą nie będzie możliwe bez pisania przeciążeń dla każdego ... –