Article View: pl.comp.objects
Article #15187Re: Wyj?tki w konstruktorze
From: Sektor van Skijlen
Date: Tue, 29 Aug 2006 11:52
Date: Tue, 29 Aug 2006 11:52
104 lines
6776 bytes
6776 bytes
Dnia Sun, 27 Aug 2006 09:31:37 -0500, A.L. skrobie: > On Sun, 27 Aug 2006 11:51:39 +0000 (UTC), Jacek > <nobody@nospamkinga.cyf-kr.edu.pl> wrote: > >Piotr Dembiński <pdemb@gazeta.pl> napisal: > >> A taki Windows NT jest w całości napisany w C++. > > > >Wybacz, ale to slaby argument. CP/M byl pisany w asemblerze, > >ale to nie powod, by ciagle w nim pisac ;) > > > >Caly podwatek to dylemat pomiedzy doskonaloscia techniczna > >(tu SvS i Ty) oraz ekonomiczna (A.L.). Mam wrazenie, ze jednak > >pieniadze zadecyduja. > Doskonalosc techniczna" oddaje najlepiej nastepujacy cytat, > potwierdzajacy to co od dawna wiadomo, a mianowicie ze C++ powstaje > "metoda alchemiczna": Wkladamy troche g... do sloika i potrzasamy. > Potem patrzymy co wyszlo. Jak rowneiz to ze tworcy jezyka nie sa w > stanie zrozumeic co robia. Widac jest za trudny dla nich. > Cytat: > ""Hmm," you might wonder, "then why does this exception safety > loophole exist at all? Why doesn't the standard just prevent the > problem by requiring compilers to Do The Right Thing when it comes > to cleanup?" > The basic answer is that it wasn't noticed, and even now that it has > been noticed it might not be desirable to fix it. The C++ standard > allows the compiler some latitude with the order of evaluation of > expressions because this allows the compiler to perform > optimizations that might not otherwise be possible. To permit this, > the expression evaluation rules are specified in a way that is not > exception-safe, and so if you want to write exception-safe code you > need to know about, and avoid, these cases. (See below for how best > to do this.) > Remember that C++ exception safety in general has not been well > understood until fairly recently (namely the summer of 1997, just > months before the standard was completed). Even so, the committee > managed to add exception safety guarantees to the standard library, > albeit necessarily at the eleventh hour in the last two meetings > before the standard was cast in stone; many of the guarantees were > added literally days before the concrete set. The problem with > new-expressions has now been noticed, but for the reasons above the > committee will have to decide whether the hole should be "fixed" or > whether it should continue to be allowed in the name of compiler > optimization flexibility..." > Ja dziekuje. Ja postoje. Taaa... super wyśmienicie, mamy super bezpieczne wyjątki w Javie. Dzięki temu wszystkie wyjątki muszą być jawnie specyfikowane. Jeśli teraz mamy nową wersję biblioteki i ktoś wymyślił nowe wyjątki, to musimy dostosować do tego naszą aplikację lub bibliotekę, jeśli chcemy te wyjątki przepuszczać. Bo super wybitni jajogłowi twórcy Javy wymyślili, jak zrobić bezpieczne wyjątki, ale nie wymyślili, jak zrobić, żeby można było w drodze wyjątku zrobić przezroczyste wyjątki. Tak samo, przez callback również żadnego wyjątku (poza Error i pochodnymi) się nie przeciśnie. Ludzie od C++ zdawali sobie sprawę, że chociaż bezpieczne wyjątki mogłyby przyczynić się zarówno do bezpieczniejszego oprogramowania, jak i do lepszych optymalizacji (w tym wykrywania sytuacji "unexpected" na etapie kompilacji), to jednak do tego należałoby opracować również wiele koncepcji ocierających się o generyzm względem typów specyfikowanych wyjątków (np. jak napisać takie for_each, żeby wypuszczało wszystkie takie wyjątki, jakie wypuszcza funkcja podana jako callback). Dlatego darowano sobie całą sprawę, bo C++ nie był jeszcze na to gotowy. Ludzie od Javy stwierdzili, że Java jest na to gotowa i wprowadzili. Efekt jest taki, że jeśli chcemy mieć bibliotekę, która jest odporna na zmiany w bibliotekach zależnych, w tym w kwestii zgłaszanych wyjątków, musi przechwytywać wszystko, co się rusza. Koleny efekt jest taki, że ThreadDeath jest pochodną Error, mimo że najbardziej naturalnym przodkiem dla tej klasy byłby Exception (lub któraś jego pochodna). Niestety zbyt wiele bibliotek przechwytuje "w ciemno" wszelkie pochodne Exception... Najśmieszniejsze w tym wszystkim jednak nie jest samo to, ale fakt, że w C++ w większości przynajmniej bibliotek do każdego elementu, który w razie błędu rzuca wyjątkiem, da się znaleźć alternatywę, która nie rzuca wyjątkiem, tylko zgłasza problem przez wartość zwracaną. W Javie natomiast, nadomiar tego złego, co powyżej, zgłoszono idealistyczne wymaganie, że wyjątki są jedyną metodą zgłaszania błędnych sytuacji. Problem exception safety w C++ jest wybujały. Przynajmniej jeśli chodzi o bibliotekę standardową, błędy zgłoszone przez wyjątki zwykle kwalifikują program do natychmiastowego zakończenia, a efektem "exception unsafety" są wycieki pamięci. Co mnie obchodzą wycieki pamięci, które następują na 5 sekund przed zakończeniem programu? W Javie dokładnie te same "wycieki" trwają znacznie dłużej. Przy okazji proponuję również poczytać o tym, dlaczego nie należy stosować Thread.stop i Thread.suspend. Wobec takich "faktów", ja również chętnie postoję. -- // _ ___ Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl> \\ L_ |/ `| /^\ ,() <ethouris(O)gmail.com> // \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx "I am allergic to Java because programming in Java reminds me casting spells"
Technical Details
Message-ID:
<ed19qb$3eu$1@kujawiak.man.lodz.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mailReferences:
<1156145142.606030.39100@m73g2000cwd.googlegroups.com> <ece4m4$88j$1@inews.gazeta.pl> <ecesvp$k3h$3@kujawiak.man.lodz.pl> <eci6qt$h30$1@inews.gazeta.pl> <ch3qe25s17dild5v1m7ei4c43b0n2tka4e@4ax.com> <ecm9eg$g71$4@kujawiak.man.lodz.pl> <a1l0f215rtj4kj6o35sora0fd2bl0qn0k9@4ax.com> <87lkpbs6yq.fsf@hector.domek> <ecs10b$795$1@srv.cyf-kr.edu.pl> <i0b3f25nvj9fr6ats7kjvntr20g3gsruiu@4ax.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <ethouris@guess.if.gmail.com.is.valid.or.invalid>
Newsgroups: pl.comp.objects
Subject: Re: Wyj?tki w konstruktorze
Date: Tue, 29 Aug 2006 11:52:43 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 104
Sender: Michal Malecki <sektor@zly.kis.p.lodz.pl>
Message-ID: <ed19qb$3eu$1@kujawiak.man.lodz.pl>
References: <1156145142.606030.39100@m73g2000cwd.googlegroups.com> <ece4m4$88j$1@inews.gazeta.pl> <ecesvp$k3h$3@kujawiak.man.lodz.pl> <eci6qt$h30$1@inews.gazeta.pl> <ch3qe25s17dild5v1m7ei4c43b0n2tka4e@4ax.com> <ecm9eg$g71$4@kujawiak.man.lodz.pl> <a1l0f215rtj4kj6o35sora0fd2bl0qn0k9@4ax.com> <87lkpbs6yq.fsf@hector.domek> <ecs10b$795$1@srv.cyf-kr.edu.pl> <i0b3f25nvj9fr6ats7kjvntr20g3gsruiu@4ax.com>
NNTP-Posting-Host: zly.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1156852363 3550 212.191.89.2 (29 Aug 2006 11:52:43 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Tue, 29 Aug 2006 11:52:43 +0000 (UTC)
User-Agent: tin/1.6.2-20030910 ("Pabbay") (UNIX) (SunOS/5.9 (sun4u))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit