2011-06-29 23 views
24

Mam nadzieję, że to jest proste. Pracuję w dużej kodowej bazy, ogólna jakość jest dobra, ale czasami można dostać niektóre z nich:Czy mogę usunąć pusty połów z rzutu?

try 
{ 
    // Calls a .NET remoting method. 
} 
catch 
{ 
    throw; 
} 

Uwaga nie ma wreszcie logika i haczyk nie określa żadnych wyjątków lub zrobić coś innego niż to, co Podałem powyżej. Jednak wiem, że przechwytywanie i ponowne rzucanie może zmienić stos wywołań w szczegółach wyjątku. Nie jestem pewien, czy to zachowanie jest tutaj specjalnie ze względu na wywołanie zdalne .NET.

Czy można bezpiecznie usunąć tę próbę? O ile widzę, jest, ale pomyślałem, że najpierw sprawdzę jakieś dziwne zachowanie.

+2

@Dan Ciekawe dlaczego uważasz, że na pytanie zmiana była wymagana? –

+1

Mimo że zmiana tytułu jest delikatną czynnością, staram się je edytować, gdy myślę, że może być bardziej przeszukiwalna. http://www.google.com/?q=can+i+wymagam+pustej+przechowywania+zrzutem teraz wskazuje na twoje pytanie jako najwyższą odpowiedź i jestem pewien, że to jest pytanie, które ludzie wpisaliby bardziej prawdopodobnie niż twój oryginalny tytuł. –

+0

Wystarczająco uczciwe, podejrzewał, że szukał. –

Odpowiedz

14

O ile mi wiadomo, catch (Exception ex) { throw ex } resetuje ślad stosu. I tylko catch { throw; } nie.

Więc jeśli nie wykonasz żadnej dodatkowej logiki przy błędzie, np. rejestrowanie, nie znam powodu, aby nie usuwać tego połowu.

21

Ponowne umieszczenie , jak pokazałeś,, nie powinno zmieniać stosu wywołań, chyba że jest coś wyjątkowego w zdalnych wyjątkach. (Wiem, że istnieją pewneszczególne aspekty, ale nie sądzę, że w grę wchodzą tutaj.) Jest to rodzaj rzeczy, które robi stracić informacje:

catch(Exception e) 
{ 
    throw e; // Not throw; 
} 

Moje przypuszczenie, że jest niektórzy programiści uwzględnili to tylko dlatego, że mogą umieścić punkt przerwania na linii throw. Pozbyłbym się tego.

+3

Użycie samego 'throw' może nadal zmienić ślad stosu ** jeśli ** wyjątek został zgłoszony w tej samej ramce stosu co instrukcja' throw' - w tym przypadku numer linii jest resetowany do linii instrukcji 'throw' (a nie linia, z której został pierwotnie wyrzucony wyjątek) – Justin

+2

Został usunięty, teraz potrzebuję tylko niepozornego numeru wady, aby go sprawdzić :-) –

4

W niektórych sytuacjach związanych z bezpieczeństwem dostępu do kodu, klauzula catch-rethrow może być niezbędną funkcją bezpieczeństwa. Ale wątpię, by miało to zastosowanie tutaj. Zwłaszcza, że ​​żadna rozsądna osoba nie użyłaby tego wzoru bez dodawania komentarza.

Celem jest zapobieganie uruchamianiu filtrów wyjątków przy zwiększonych uprawnieniach.

Kilka Pokrewne artykuły:

http://blogs.msdn.com/b/shawnfa/archive/2005/03/31/404320.aspx
http://msdn.microsoft.com/en-us/library/8cd7yaws(v=VS.100).aspx
http://www.pluralsight-training.net/community/blogs/keith/archive/2005/03/31/7149.aspx


Wydaje się być przestarzały od .net 2:
Impersonation and Exception Filters in v2.0

+0

Nie jest tak w przypadku nas, ponieważ nie mamy użyj CAS.Jednak ciekawe informacje, dzięki. –