2010-04-22 13 views
13

Cytat z MSDN:C# wyjątek wyrzucania finalizatora?

Jeśli finalizacja lub przesłonięcie funkcji Finalize powoduje zgłoszenie wyjątku, środowisko wykonawcze ignoruje wyjątek, kończy metodę Finalize i kontynuuje proces finalizacji.

Jednak jeśli mam:

~Person() 
{ 
throw new Exception("meh"); 
} 

to skutkuje wyłączeniem wykonywania?

p.s. Wiem, że to nigdy nie powinno się zdarzyć, ale jestem ciekawy tego zachowania. Jeden z naszych klientów miał pustą próbę złapania wszystkich swoich finalizatorów .. nawet nie odnotował, kiedy coś poszło nie tak lub poprawił obiekt:/

+2

Nie należy nigdy używać finalizerów. Nigdy, tak jak w, chyba że wiesz dokładnie, dlaczego musisz tego użyć. – Dykam

+0

"to spowoduje wyjątek środowiska wykonawczego?" Czy mówisz, że próbowałeś tego i powoduje to wyjątek? Czy możesz poprosić nas o przetestowanie tego? – AaronLS

+1

to powoduje wyjątek środowiska wykonawczego. Dykam, dzięki za informację, że nigdy nie powinienem używać finalizatorów ... lol! – sjhuk

Odpowiedz

22

Ważne jest łączenie źródła twojego cytatu. Muszę założyć, że mówi o starej wersji .NET, być może wersji 1.x. Próbowała być "tolerancyjna" z nieobsługiwanych wyjątków, połykając je bez pisków. To nie zadziałało dobrze, fragmenty kodu po cichu upadającego są niezwykle trudne do debugowania.

Wersja .NET 2.0 położyła kres temu, domyślny host CLR kończy aplikację dla każdego nieobsługiwanego wyjątku. Wyjątek w finalizatorze jest śmiertelny.

+1

dzięki Hans. Początkowo znalazłem cytat z nowej książki O'Reilly .NET 4.0, jednak cytat pochodził z .NET 1.1. Może powinni zaktualizować książkę;) Dzięki – sjhuk

+7

Wow, kiepska edycja. Uważaj na resztę książki. –

+2

Łącza MSDN: 4.0 http://msdn.microsoft.com/en-us/library/system.object.finalize(v=VS.100).aspx 1.1 http://msdn.microsoft.com/en-us/ biblioteka/system.object.finalize (v = VS.71) .aspx – MPritchard

Powiązane problemy