W języku C#, czy następujący kod wyrzuci e
zawierający dodatkowe informacje na stosie wywołań?Wyrzucanie wyjątków
...
catch(Exception e)
{
e.Data.Add("Additional information","blah blah");
throw;
}
W języku C#, czy następujący kod wyrzuci e
zawierający dodatkowe informacje na stosie wywołań?Wyrzucanie wyjątków
...
catch(Exception e)
{
e.Data.Add("Additional information","blah blah");
throw;
}
Tak, będzie. Wielu programistów nie zdaje sobie sprawy, że poniższy kod wygeneruje nowy wyjątek od tego punktu w stosie wywołań, a nie w wywołaniach wykonanych poprzednio na stosie przed catch
.
...
catch(Exception e)
{
e.Data.Add("Additional information","blah blah");
throw e;
}
Nauczyłem się tego na własnej skórze!
Wyjątki nie są niezmienne, a możliwość dodania do nich informacji jest jedną z przyczyn takiego stanu rzeczy.
Tak, tak, dane zostaną dodane do bulgoczących informacji o wyjątkach.
var answer = "No";
try
{
try
{
throw new Exception();
}
catch (Exception e)
{
e.Data.Add("mykey", "myvalue");
throw;
}
}
catch (Exception e)
{
if((string)e.Data["mykey"] == "myvalue")
answer = "Yes";
}
Console.WriteLine(answer);
Console.ReadLine();
Po uruchomieniu kodu okaże się, że odpowiedź brzmi tak :-)
... bardzo zabawne;) – Ben
Można to zrobić, ale ze względu na FxCop Zawsze stworzył niestandardowe wyjątki gdy kiedykolwiek i rzucać wyjątek. To daje dzwoniącemu możliwość łatwego łapania i rozumienia różnych typów błędów. Jeśli musisz uwzględnić kolejny wyjątek, możesz użyć wyjątku wyjątku InnerException lub po prostu wyliczyć zmienną składową dla nowego wyjątku.
Dzięki temu dowiesz się, jak skutecznie osiągnąć sukces. http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/
Jest to jedna z tych rzeczy programowania, które ludzie lubią pominąć, ponieważ to po prostu dodatkowa praca, aby uzyskać funkcjonalność aplikacji.
Jest to strona z moim osobistym Zen Programowania:
Program jest twój dom. Uczyń to tak dobrze, jak możesz, więc łatwo jest żyć.
+1 za sugestię tworzenie/wychwytywanie niestandardowych wyjątków. Oczywiście zależy to od tego, czy masz kontrolę nad kodem, który rzuca wyjątek, który łapiesz, czy jest to trzecia biblioteka, którą utknąłeś z wyjątkami, jakie rzuca ;-) –
+1 za anty-przykład :) – Pharabus
Oto artykuł Eric Lippert: http://blogs.msdn.com/ericlippert/archive /2010/03/04/too-much-reuse.aspx "Rzut"; "nie resetuje śladu stosu," rzut ex; "robi" – ram