Jaki jest prawdziwy narzut try/catch w C#?

Tak więc, wiem,że try / catch dodaje trochę narzutu i dlatego nie jest dobrym sposobem kontrolowania przepływu procesu, ale skąd się bierze ten narzut i jaki jest jego rzeczywisty wpływ?

Author: HerbalMart, 2008-09-09

12 answers

Nie jestem ekspertem w implementacjach języka( więc weź to z przymrużeniem oka), ale myślę, że jednym z największych kosztów jest rozwijanie stosu i przechowywanie go do śledzenia stosu. Podejrzewam, że dzieje się tak tylko wtedy ,gdy wyjątek jest wyrzucany (ale nie wiem), a jeśli tak, to będzie to przyzwoicie koszt ukryty za każdym razem, gdy wyjątek jest wyrzucany... więc to nie jest tak, że po prostu przeskakujesz z jednego miejsca w kodzie do drugiego, dużo się dzieje.

Myślę, że to nie problem, ponieważ o ile używasz wyjątków dla wyjątkowego zachowania(więc nie jest to typowa, oczekiwana ścieżka przez program).

 46
Author: Mike Stone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-09 16:41:10

Trzy punkty do zrobienia tutaj:

  • Po pierwsze, nie ma kary za wydajność lub nie ma w rzeczywistości o try-catch bloków w kodzie. Nie powinno to być brane pod uwagę przy próbie uniknięcia ich w aplikacji. Trafienie wydajności wchodzi w grę tylko wtedy, gdy rzuca się wyjątek.

  • Gdy wyjątek jest wyrzucany oprócz operacji odwijania stosu itp, które mają miejsce, o których inni wspominali, powinieneś mieć świadomość, że cała grupa rzeczy związane z runtime / reflection mają miejsce w celu wypełnienia członków klasy exception, takich jak obiekt śledzenia stosu i różne członkowie typu itd.

  • Uważam, że jest to jeden z powodów, dla których ogólna rada, jeśli zamierzasz rethrow wyjątkiem jest po prostu throw; zamiast rzucać wyjątek ponownie lub konstruować nowy, ponieważ w tych przypadkach wszystkie informacje o stosie są regatowane, podczas gdy w prostym rzucie to wszystko zachowany.

 90
Author: Shaun Austin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-09 17:19:01

Czy pytasz o narzut użycia try / catch / finally, gdy wyjątki nie są wyrzucane, lub narzut użycia WYJĄTKÓW do sterowania przepływem procesu? W przeciwieństwie do tego, co się dzieje z dzieckiem, nie jest on w stanie zapalić świeczki urodzinowej malucha.]}

  • możesz spodziewać się dodatkowych braków pamięci podręcznej z powodu wyrzuconego wyjątku, który ma dostęp do danych rezydentnych, które normalnie nie są w pamięci podręcznej.
  • Możesz spodziewać się dodatkowej strony błędy spowodowane wyrzuceniem wyjątku dostępu do kodu nierezydenta i danych, które normalnie nie znajdują się w zestawie roboczym aplikacji.

    • na przykład, wyrzucenie wyjątku będzie wymagało od CLR znalezienia lokalizacji bloków finally I catch na podstawie bieżącego adresu IP i zwracanego adresu IP każdej klatki, dopóki wyjątek nie zostanie obsłużony wraz z blokiem filtra.
    • dodatkowy koszt budowy i rozdzielczość nazwy w celu utworzenia ramek do celów diagnostycznych, w tym odczytu metadane itp.
    • Oba powyższe elementy zazwyczaj mają dostęp do "zimnego" kodu i danych, więc trudne błędy strony są prawdopodobne, jeśli w ogóle masz ciśnienie pamięci:

      • CLR próbuje umieścić kod i dane, które są rzadko używane, daleko od danych, które są często używane do poprawy lokalizacji, więc działa to przeciwko tobie, ponieważ zmuszasz zimno do bycia gorącym.
      • koszt błędu twardej strony, jeśli w ogóle, przyćmi wszystko inne.
  • typowy połów sytuacje są często głębokie, dlatego powyższe efekty mają tendencję do powiększania (zwiększając prawdopodobieństwo błędów strony).

Jeśli chodzi o rzeczywisty wpływ kosztów, może się to znacznie różnić w zależności od tego, co jeszcze dzieje się w Twoim kodzie w tym czasie. Jon Skeet ma dobre podsumowanie tutaj , z kilkoma przydatnymi linkami. Zgadzam się z jego stwierdzeniem, że jeśli dojdziesz do punktu, w którym wyjątki znacznie szkodzą twojej wydajności, masz problemy z używaniem WYJĄTKÓW poza występem.

 18
Author: RoadWarrior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-24 16:48:05

Z mojego doświadczenia wynika, że największym obciążeniem jest rzucanie wyjątków i obchodzenie się z nimi. Kiedyś pracowałem nad projektem, w którym kod podobny do poniższego został użyty do sprawdzenia, czy ktoś ma prawo edytować jakiś obiekt. Ta metoda HasRight() była używana wszędzie w warstwie prezentacji i była często wywoływana dla 100 obiektów.

bool HasRight(string rightName, DomainObject obj) {
  try {
    CheckRight(rightName, obj);
    return true;
  }
  catch (Exception ex) {
    return false;
  }
}

void CheckRight(string rightName, DomainObject obj) {
  if (!_user.Rights.Contains(rightName))
    throw new Exception();
}

Gdy baza danych testów została wypełniona danymi testowymi, doprowadziło to do bardzo widocznego spowolnienia podczas otwierania nowych formularzy itp.

Więc refakturowałem to do następującej, która - według późniejszych quick ' n brudnych pomiarów-jest o 2 rzędy wielkości szybciej:

bool HasRight(string rightName, DomainObject obj) {
  return _user.Rights.Contains(rightName);
}

void CheckRight(string rightName, DomainObject obj) {
  if (!HasRight(rightName, obj))
    throw new Exception();
}

Krótko mówiąc, używanie WYJĄTKÓW w normalnym przepływie procesu jest o dwa rzędy wielkości wolniejsze niż używanie podobnego przepływu procesu bez wyjątków.

 6
Author: Tobi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-11 20:34:15

Nie wspominając o tym, że to wewnątrz często nazywanej metody może mieć wpływ na ogólne zachowanie aplikacji.
Na przykład rozważam użycie Int32.Analizowanie jako zła praktyka w większości przypadków, ponieważ rzuca wyjątki dla czegoś, co można łatwo złapać w inny sposób.

Podsumowując wszystko co tu napisano:
1) Użyj try..catch bloki złapać nieoczekiwane błędy-prawie bez kary wydajności.
2) nie używaj wyjątków dla wyłączonych błędów, jeśli możesz unikaj tego.

 3
Author: dotmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 18:06:28

Napisałem artykuł na ten temat jakiś czas temu, ponieważ było wiele osób pytających o to w tym czasie. Możesz go znaleźć i Kod testu na http://www.blackwasp.co.uk/SpeedTestTryCatch.aspx .

Wynik jest taki, że istnieje niewielka ilość narzutu dla bloku try/catch, ale tak mała, że należy ją zignorować. Jeśli jednak uruchamiasz bloki try/catch w pętlach, które są wykonywane miliony razy, możesz rozważyć przeniesienie bloku poza pętlę jeśli to możliwe.

Kluczowy problem z wydajnością w blokach try/catch polega na tym, że rzeczywiście wyłapujesz wyjątek. Może to spowodować zauważalne opóźnienie w aplikacji. Oczywiście, gdy coś idzie nie tak, większość programistów (i wielu użytkowników) rozpoznaje pauzę jako wyjątek, który ma się wydarzyć! Kluczem jest tutaj, aby nie używać obsługi wyjątków dla normalnych operacji. Jak sama nazwa wskazuje, są wyjątkowe i powinieneś zrobić wszystko, aby uniknąć ich wyrzucenia. Nie powinieneś wykorzystaj je jako część oczekiwanego przepływu programu, który działa poprawnie.

 3
Author: BlackWasp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-09 00:17:35

Zrobiłem wpis na blogu na ten temat w zeszłym roku. Zobacz też Najważniejsze jest to, że nie ma prawie żadnych kosztów dla try block, jeśli nie występuje wyjątek-a na moim laptopie wyjątek wynosił około 36µs. To może być mniej niż się spodziewałeś, ale należy pamiętać, że te wyniki, gdzie na płytkim stosie. Ponadto pierwsze wyjątki są bardzo powolne.

 2
Author: Hafthor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-09 17:20:03

Znacznie łatwiej jest pisać, debugować i utrzymywać kod wolny od komunikatów o błędach kompilatora, komunikatów ostrzegawczych o analizie kodu i rutynowych akceptowanych WYJĄTKÓW (szczególnie wyjątków, które są wyrzucane w jednym miejscu i akceptowane w innym). Ponieważ jest to łatwiejsze, kod będzie średnio lepiej napisany i mniej błędny.

Dla mnie, że programista i jakość overhead jest głównym argumentem przeciwko użyciu try-catch dla przepływu procesu.

Komputerowy nagłówek wyjątków jest niewielkie w porównaniu, a zwykle małe pod względem zdolności aplikacji do spełnienia rzeczywistych wymagań wydajności.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 21:06:16

Wbrew powszechnie przyjętym teoriom, try/catch może mieć znaczący wpływ na wydajność, i to niezależnie od tego, czy wyjątek zostanie wyrzucony, czy nie!

  1. wyłącza pewne automatyczne optymalizacje (według projektu), a w niektórych przypadkach wstrzykuje debugowanie kodu, czego można się spodziewać po pomocy debugowania . Zawsze będą ludzie, którzy nie zgadzają się ze mną w tej kwestii, ale język tego wymaga, a demontaż to pokazuje, więc ci ludzie są przez definicja słownikowa urojeni .
  2. Może mieć negatywny wpływ na konserwację. jest to właściwie najważniejszy problem tutaj, ale ponieważ moja ostatnia odpowiedź (która skupiała się prawie całkowicie na nim) została usunięta, postaram się skupić na mniej znaczącej kwestii (mikro-optymalizacja) w przeciwieństwie do bardziej znaczącej kwestii (makro-optymalizacja).

Ten pierwszy został omówiony w kilku wpisach na blogu przez Microsoft MVPs na przestrzeni lat, a Mam nadzieję, że można je łatwo znaleźć, ale StackOverflow dba o tak bardzo o treść więc podam linki do niektórych z nich jakowypełniacz dowód: {]}

Istnieje również ta odpowiedź , która pokazuje różnicę między zdemontowanym kodem z - i bez użycia try/catch.

Wydaje się tak oczywiste, że istnieje jest nad głową co jest rażąco widoczne w generowaniu kodu, a to nawet wydaje się być uznane przez ludzi, którzy cenią Microsoft! A jednak jestem, powtarzając internet ...

Tak, istnieją dziesiątki dodatkowych instrukcji MSIL dla jednej trywialnej linii kodu, a to nawet nie obejmuje wyłączonych optymalizacji, więc technicznie jest to mikro-optymalizacja.


Przed laty zamieściłem odpowiedź, która została usunięta, ponieważ skupiała się na wydajności programistów ( makro-optymalizacja).

Jest to niefortunne, ponieważ żadna oszczędność kilku nanosekund tu i ówdzie czasu procesora nie zrekompensuje wielu nagromadzonych godzin ręcznej optymalizacji przez ludzi. Za co twój szef płaci więcej: za godzinę twojego czasu, czy za godzinę z uruchomionym komputerem? W którym momencie wyciągamy wtyczkę i przyznajemy, że nadszedł czas, aby po prostu kupić szybszy komputer ?

Najwyraźniej powinniśmy optymalizować nasze priorytety, a nie tylko nasz kod! In my last odpowiedź czerpałem z różnic między dwoma fragmentami kodu.

Za pomocą try/catch:

int x;
try {
    x = int.Parse("1234");
}
catch {
    return;
}
// some more code here...

Nie używać try/catch:

int x;
if (int.TryParse("1234", out x) == false) {
    return;
}
// some more code here

Zastanów się z perspektywy programisty, który jest bardziej narażony na marnowanie twojego czasu, jeśli nie na profilowanie/optymalizację (omówione powyżej), które prawdopodobnie nie byłoby nawet konieczne, gdyby nie try/catch problem, a następnie w przewijaniu kodu źródłowego... Jeden z nich ma cztery dodatkowe linie kotła śmieci!

W miarę jak coraz więcej pól jest wprowadzanych do klasy, wszystkie te śmieci typu boilerplate gromadzą się (zarówno w kodzie źródłowym, jak i zdemontowanym) znacznie poza rozsądnymi poziomami. Cztery dodatkowe linie na pole i zawsze są takie same... Czy nie uczono nas, żebyśmy się nie powtarzali? Przypuszczam, że moglibyśmy ukryć try/catch za jakąś domową abstrakcją, ale... wtedy równie dobrze możemy po prostu unikać WYJĄTKÓW(np. używać Int.TryParse).

To nie jest nawet skomplikowany przykład; Widziałem próby tworzenia nowych klas w try/catch. Rozważ, że cały kod wewnątrz konstruktora może zostać zdyskwalifikowany z pewnych optymalizacji, które w przeciwnym razie byłyby automatycznie stosowane przez kompilator. Czy jest lepszy sposób na zrobienie teorii, że kompilator jest powolny , W przeciwieństwie do kompilator robi dokładnie to, co mu się każe ?

Zakładając, że wyjątek jest wyrzucany przez wspomniany konstruktor i jakiś błąd jest wyzwalany jako w rezultacie kiepski programista konserwacji musi go wyśledzić. To może nie być takie łatwe zadanie, jak w przeciwieństwie do spaghetti code of goto nightmare, try/catch może powodować bałagan w trzech wymiarach , ponieważ może przenieść się w górę stosu nie tylko do innych części tej samej metody, ale także do innych klas i metod, z których wszystkie będą obserwowane przez programistę konserwacji, w trudny sposób! Ale powiedziano nam, że "goto jest niebezpieczne", heh!

Na końcu Wspominam, try/catch ma swoją zaletę, którą jest, został zaprojektowany, aby wyłączyć optymalizację ! Jest to, jeśli wolisz, pomoc debugowania ! Do tego został zaprojektowany i do tego powinien być używany...

Myślę, że to też pozytywny punkt. Może być używany do wyłączania optymalizacji, które w przeciwnym razie mogłyby okaleczyć bezpieczne, rozsądne algorytmy przekazywania wiadomości dla aplikacji wielowątkowych i złapać możliwe Warunki wyścigu;) to jedyny scenariusz, który mogę pomyśl o użyciu try / catch. Nawet to ma alternatywy.


Do czego służą optymalizacje try, catch i finally wyłączyć?

A. K. A

Jak się masz?try, catch i finally przydatne jako pomoc w debugowaniu?

To bariery zapisu. Wynika to ze standardu:

12.3.3.13 try-catch wypowiedzi

Dla wyrażenia stmt o postaci:

try try-block
catch ( ... ) catch-block-1
... 
catch ( ... ) catch-block-n
  • definitywny stan przypisania v na początku try-block jest taki sam jak określony stan przypisania v na początku } stmt .
  • definitywny stan przypisania v na początku catch-block-i (dla dowolnego i {60]}) jest taki sam jak definitywny stan przypisania v na początku } stmt .
  • określony stan przypisania v w punkcie końcowym stmt jest definitywnie przypisany wtedy i tylko wtedy, gdy v jest definitywnie przypisany w punkcie końcowym try-block i każdy catch-block-i (dla każdego i {60]} od 1 do n ).

Innymi słowy, na początku każdego try stwierdzenia:

  • wszystkie przypisania do widocznych obiektów przed wprowadzeniem instrukcji try muszą być kompletne, co wymaga blokady wątku na początek, co czyni go użytecznym do debugowania wyścigu warunki!
  • kompilator nie może:
    • wyeliminuj nieużywane przypisania zmiennych, do których definitywnie zostały przypisane przed try instrukcją
    • przeorganizuj lub połącz dowolne z wewnętrznych zadań (tzn. zobacz mój pierwszy link, jeśli jeszcze tego nie zrobiłeś).
    • przenieś zadania ponad tę barierę, aby opóźnić przypisanie do zmiennej, o której wie, że nie zostanie użyta do później (jeśli w ogóle) lub aby wstępnie przenieść późniejsze zadania do przodu umożliwić inne optymalizacje...

Podobna historia zawiera się dla każdego catch instrukcji; Załóżmy, że wewnątrz try instrukcji (lub konstruktora lub funkcji, które wywołuje, itp) przypisujesz do tej bezsensownej zmiennej (powiedzmy, garbage=42;), kompilator nie może wyeliminować tego stwierdzenia, bez względu na to, jak nieistotne jest ono dla obserwowalnego zachowania programu. Zadanie musi mieć zakończone zanim catch blok zostanie wszedł.

Jeśli to coś warte, finally opowiada podobnie poniżającą historię:

12.3.3.14 try-finally statements

Dla wypróbuj oświadczenie stmt o postaci:

try try-block
finally finally-block

• definitywny stan przypisania v na początku try-block jest taki sam jak definitywny stan przypisania v na początku } stmt .
* Definitywny stan przypisania v na początku wreszcie-blok jest taki sam jak określony stan przypisania v na początku } stmt .
• Definitywny stan przypisania v w punkcie końcowym stmt jest definitywnie przypisany wtedy i tylko wtedy, gdy:: o V jest definitywnie przypisany w punkcie końcowym try-block o V jest definitywnie przypisany w punkcie końcowym W końcu-bloku Jeżeli przepływ sterowania transfer (taki jak Goto ) jest dokonywany, który zaczyna się w try-block, a kończy poza try-block, wtedy v jest również uważany za definitywnie przypisany do tego transferu przepływu sterowania, jeśli vjest definitywnie przypisany w punkcie końcowym ostatecznie-block. (Nie jest to tylko wtedy, gdy-jeśli v jest definitywnie przypisany z innego powodu na tym przepływie sterowania, to nadal jest uważany za definitywny przydzielony.)

12.3.3.15 try-catch-finally statements

Definitive assignment analysis for a try-catch-wreszcie wypowiedź formularza:

try try-block
catch ( ... ) catch-block-1
... 
catch ( ... ) catch-block-n
finally finally-block

Robi się tak, jakby oświadczenie było próbą-wreszcie oświadczenie zawierające spróbuj- wypowiedź:

try { 
    try   
    try-block
    catch ( ... ) catch-block-1
    ...   
    catch ( ... ) catch-block-n
} 
finally finally-block
 2
Author: autistic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 21:07:54

Bardzo lubię Blog Hafthora , i aby dodać moje dwa grosze do tej dyskusji, chciałbym powiedzieć, że zawsze było mi łatwo, aby warstwa danych rzucała tylko jeden typ wyjątku (DataAccessException). W ten sposób moja warstwa biznesowa wie, jakiego wyjątku się spodziewać i łapie go. Następnie, w zależności od dalszych reguł biznesowych (np. jeśli mój obiekt biznesowy uczestniczy w obiegu pracy itp.), mogę rzucić nowy wyjątek (BusinessObjectException) lub kontynuować bez ponownego/rzucania.

Nie wahaj się użyć try..Złap, gdy jest to konieczne i używaj go mądrze!

Na przykład ta metoda uczestniczy w obiegu pracy...

Komentarze?

public bool DeleteGallery(int id)
{
    try
    {
        using (var transaction = new DbTransactionManager())
        {
            try
            {
                transaction.BeginTransaction();

                _galleryRepository.DeleteGallery(id, transaction);
                _galleryRepository.DeletePictures(id, transaction);

                FileManager.DeleteAll(id);

                transaction.Commit();
            }
            catch (DataAccessException ex)
            {
                Logger.Log(ex);
                transaction.Rollback();                        
                throw new BusinessObjectException("Cannot delete gallery. Ensure business rules and try again.", ex);
            }
        }
    }
    catch (DbTransactionException ex)
    {
        Logger.Log(ex);
        throw new BusinessObjectException("Cannot delete gallery.", ex);
    }
    return true;
}
 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-24 04:50:54

Możemy przeczytać w językach programowania Pragmatics autorstwa Michaela L. Scotta, że obecnie Kompilatory nie dodają żadnych nagłówków w powszechnym przypadku, to znaczy, gdy nie ma wyjątków. Więc każda praca jest wykonana w czasie kompilacji. Ale gdy wyjątek jest wrzucany w run-time, kompilator musi wykonać wyszukiwanie binarne, aby znaleźć poprawny wyjątek i stanie się to dla każdego nowego rzutu, który wykonałeś.

Ale wyjątki są wyjątkami i ten koszt jest całkowicie akceptowalny. Jeśli spróbujesz Obsługa wyjątków bez wyjątków i zamiast tego używaj kodów błędów zwrotnych, prawdopodobnie będziesz potrzebował instrukcji if dla każdego podprogramu i to będzie się wiązać w naprawdę rzeczywistym czasie. Wiesz, że instrukcja if jest konwertowana na kilka instrukcji montażu, które będą wykonywane za każdym razem, gdy wejdziesz w swoje podprogramy.

Przepraszam za mój angielski, mam nadzieję, że ci pomoże. Informacje te są oparte na cytowanej książce, więcej informacji znajduje się w rozdziale 8.5 Obsługa wyjątków.

 1
Author: Vando,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-17 12:38:33

Przeanalizujmy jeden z największych możliwych kosztów bloku try/catch, gdy jest używany tam, gdzie nie powinien być używany:

int x;
try {
    x = int.Parse("1234");
}
catch {
    return;
}
// some more code here...

A oto ten bez try/catch:

int x;
if (int.TryParse("1234", out x) == false) {
    return;
}
// some more code here

Nie licząc mało znaczącej białej spacji, można zauważyć, że te dwa równe fragmenty kodu mają prawie dokładnie taką samą długość w bajtach. Ten ostatni zawiera o 4 bajty mniej wcięć. Czy to źle?

Aby dodać obrazę do obrażenia, uczeń decyduje się na zapętlenie, podczas gdy Wejście Może być parsed as an int. Rozwiązaniem bez try/catch może być coś w stylu:

while (int.TryParse(...))
{
    ...
}

Ale jak to wygląda przy użyciu try / catch?

try {
    for (;;)
    {
        x = int.Parse(...);
        ...
    }
}
catch
{
    ...
}

Bloki Try / catch to magiczne sposoby na marnowanie wcięć, a my nadal nie znamy nawet powodu, dla którego się nie powiodło! Wyobraź sobie, jak czuje się osoba wykonująca debugowanie, gdy kod kontynuuje wykonywanie poza poważną wadą logiczną, zamiast zatrzymywać się z ładnym oczywistym błędem wyjątku. Try / catch blocks to dane leniwego człowieka Walidacja / kanalizacja.

Jednym z mniejszych kosztów jest to, że bloki try/catch rzeczywiście wyłączają pewne optymalizacje: http://msmvps.com/blogs/peterritchie/archive/2007/06/22/performance-implications-of-try-catch-finally.aspx myślę, że to też pozytywny punkt. Może być używany do wyłączania optymalizacji, które w przeciwnym razie mogłyby okaleczyć bezpieczne, rozsądne algorytmy przekazywania wiadomości dla aplikacji wielowątkowych i złapać możliwe Warunki wyścigu;) to jedyny scenariusz, który mogę pomyśl o użyciu try / catch. Nawet to ma alternatywy.

 -4
Author: Sebastian Ramadan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-04 07:45:23