2010-03-16 18 views
11

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; 
} 

Odpowiedz

12

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!

+0

+1 za anty-przykład :) – Pharabus

+1

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

1

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.

4
 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 :-)

+1

... bardzo zabawne;) – Ben

1

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ć.

+0

+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 ;-) –