noexcept - jeden rabin powie tak, drugi rabin powie nie :) 4343 1

O temacie

Autor Wonski

Zaczęty 1.08.2016 roku

Wyświetleń 4343

Odpowiedzi 1

Wonski

Wonski

Gry (themodders@telegram)
radio engineer
posty256
Propsy91
ProfesjaProgramista
  • Gry (themodders@telegram)
  • radio engineer
Cześć, chciałem się zapytać jak to jest z stosowaniem tego słowa kluczowego dla funkcji/metod.

Na polskich forach albo na stackoverflow jedni piszą, ze to stosowanie tego słowa dla metod nie rzucających wyjątku należy do tzw "dobrych praktyk" bo to użyteczna informacja dla programisty.
Z kolei inni piszą, żeby tego nie stosować bo podobno są potem problemy jak się używa jakiegoś dzikiego trybu kompilacji, i w ogóle to nieudany feature dodany do modern cpp...

Jednak w implementacji stl'a wg Micorsoftu można spotkać wiele metod z tym przyrostkowym słowem kluczowym.
Juz pomijam kwestie, ze w implementacji microsoftu istnieje macro __nothrow.
Jak to jest naprawdę i która ze stron ma racje?
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Nie chodzi o dzikie tryby kompilacji. Chodzi o to jak to działa a jak nie działa.

Jak to nie działa a wiele osób może myśleć że tak działa albo chce żeby tak działało:
"Oznacza że ta funkcja nigdy nie rzuci wyjątku"

Jak działa:
"Kiedy ta funkcja rzuci wyjątek, natychmiast ubij cały program"

Trudno się dziwić że wiele osób nie lubi kiedy nagle zabija się im cały program, bez możliwości odratowania go lub chociaż zapisania czegoś na dysk (nawet jakiegoś logu).

noexcept jest potrzebne w pewnych specyficznych sytuacjach, głównie w bibliotece standardowej. Pozwala omijać pewne mechanizmy bezpieczeństwa, bo oznacza że nie trzeba przygotowywać się na wypadek gdyby dane wywołanie rzuciło wyjątek. Jeśli wiemy że na interfejsie jest 'noexcept', to możemy totalnie nie przejmować się tym co będzie jeśli ta funkcja rzuci wyjątek. Bo program zostanie natychmiast ubity.

Możesz traktować to jako coś w stylu "do tej funkcji nie trzeba uwzględniać żadnego exception handlingu, biorę na siebie pełną odpowiedzialność za katastrofalne skutki wystąpienia wyjątku".


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry