Błędy składniowe
Błędnie wpisane wyrażenie, instrukcja lub konstrukcja to błąd składni.
Rozważ następujące dwa stwierdzenia:
int arr [] = 1, 2, 3; //prawidłowySą to definicje tej samej tablicy. Pierwszy jest poprawny. Drugi brakuje [], a to jest błąd składni. Program z błędem składni nie może się skompilować. Kompilacja nie powiada się z komunikatem o błędzie wskazującym błąd składni. Dobrze jest to, że błąd składni można zawsze naprawić, jeśli programista wie, co robi.
Błąd logiczny
Błąd logiczny jest błędem popełnianym przez programistę, gdy dokonuje się błędnego kodowania logicznego. Może być wynikiem ignorancji od programisty do funkcji języka programowania lub nieporozumienia o tym, co powinien zrobić program.
W tej sytuacji program jest kompilowany pomyślnie. Program działa dobrze, ale daje złe wyniki. Taki błąd może wynikać z powtórzenia pętli 5 razy, gdy jest ona dokonywana do iteracji 10 razy. Może być również tak, że pętla jest nieświadomie wytwarzana, aby iterować nieskończenie. Jedynym sposobem rozwiązania tego rodzaju błędu jest dokładne programowanie i dokładne przetestowanie programu przed przekazaniem go klientowi.
Błędy czasu wykonawczego
Złe lub wyjątkowe dane wejściowe powodują błędy czasu wykonawczego. W tym przypadku program został pomyślnie skompilowany i działa dobrze w wielu sytuacjach. W niektórych sytuacjach program rozbija się (i zatrzymuje się).
Wyobraź sobie, że w segmencie kodu programu 8 musi być podzielone przez szereg mianowników. Jeśli więc licznik 8 zostanie podzielony przez mianownik 4, odpowiedź (iloraz) wynosi 2. Jeśli jednak użytkownik wprowadzi 0 jako mianownik, program by się zawalił. Podział na 0 nie jest dozwolony w matematyce i nie jest również dozwolony w obliczaniu. Division-by-Zero należy zapobiec w programowaniu. Obsługa wyjątków obsługuje błędy w czasie wykonywania, takie jak Division-by-Sero. Poniższy program pokazuje, jak poradzić sobie z problemem Division-by-Zero bez użycia funkcji wyjątku w C ++:
#włączaćWyjście to 4. Gdyby mianownik wynosił 0, wynik byłby:
„Podział zero jest niedozwolony!"
Głównym kodem tutaj jest konstrukt IF-Else. Jeśli mianownik nie ma 0, oddział odbędzie się; Jeśli jest to 0, oddział nie nastąpi. Komunikat o błędzie zostanie wysłany do użytkownika, a program będzie nadal działał bez awarii. Błędy czasu wykonawczego są zwykle obsługiwane przez unikając wykonywania segmentu kodu i wysyłając komunikat o błędzie do użytkownika.
Funkcja wyjątku w C ++ wykorzystuje blok próbny dla bloków if i blok łapania dla bloku ewentualnego, aby obsłużyć błąd, tak jak następuje:
#włączaćZauważ, że nagłówek próba nie ma argumentu. Zwróć również uwagę, że blok złapania, który jest jak definicja funkcji, ma parametr. Typ parametru musi być taki sam jak operand (argument) wyrażania rzutów. Wyrażanie rzutów jest w bloku trybu. Rzuca argument wyboru programisty, który jest powiązany z błędem, a blok łapy to łapie. W ten sposób kod w bloku trybu nie jest wykonywany. Następnie blok łapy wyświetla komunikat o błędzie.
W tym artykule wyjaśniono obsługę wyjątków w C++. Podstawowa wiedza w C ++ jest warunkiem wstępnym, aby czytelnik zrozumiał ten artykuł.
Treść artykułu:
Funkcja rzucająca wyjątek:
Funkcja może również rzucić wyjątek, podobnie jak to, co robi blok próbny. Rzucanie odbywa się w ramach definicji funkcji. Poniższy program ilustruje to:
#włączaćZauważ, że tym razem blok próba ma tylko wywołanie funkcji. Jest to funkcja nazywana, która ma operację rzucania. Blok połowowy łapie wyjątek, a wyjście to:
„Imię osoby nie może rozpocząć małej litery!"
Tym razem typ rzucony i złapany jest charakterem.
Więcej niż jedno blokowanie łapówek dla jednego bloku trybu:
Może być więcej niż jeden blok złapania dla jednego bloku próbnego. Wyobraź sobie sytuację, w której wejściem może być dowolna z postaci klawiatury, ale nie cyfra, a nie alfabet. W takim przypadku muszą istnieć dwa bloki połowowe: jeden dla liczby całkowitej, aby sprawdzić cyfrę, a jeden dla charakterze, aby sprawdzić alfabet. Poniższy kod to ilustruje:
#włączaćNie ma wyjścia. Jeśli wartość danych wejściowych była cyfrą, e.G., „1”, wyjściem byłoby:
„Wejście cyfrowe jest zabronione!"
Jeśli wartość wejścia była alfabetem, e.G., „A”, wyjściem byłoby:
„Wkład znaków jest zabroniony!"
Zauważ, że na liście parametrów dwóch bloków połowów nie ma nazwy identyfikatora. Zwróć również uwagę, że w definicji dwóch bloków połowów konkretne argumenty rzucone nie zostały zweryfikowane, czy ich wartości są dokładne, czy nie.
Liczy się dla haczyka, to typ; haczyk musi pasować do rodzaju rzucanego operandu. Szczególną wartość wyrzuconego argumentu (operand) można w razie potrzeby wykorzystać do dalszej weryfikacji.
Więcej niż jeden obsługę dla tego samego typu
Możliwe jest posiadanie dwóch obsługi tego samego typu. Po wyrzuceniu wyjątku kontrola jest przenoszona do najbliższego modułu obsługi z typem pasującym. Poniższy program ilustruje to:
#włączaćWyjście to:
„Wejście cyfrowe jest zabronione!"Zagnieżdżone bloki prób/catch:
Wypróbuj/łapy bloki mogą być zagnieżdżone. Powyższy program wprowadzania znaków niealfanumerycznych z klawiatury jest tutaj powtarzany, ale z zagnieżdżonym kodem błędu alfabetycznego:
#włączaćBłąd alfabetyczny próba/łapanie jest zagnieżdżona w blokie trybu cyfrowego. Działanie tego programu i poprzednia operacja, z której jest kopiowany.
Niewykonalny specyfikator
Rozważ następującą funkcję:
void fn (const char* str) no -ofceptZwróć uwagę na specyfikator „No -Except” tuż po prawej nawiasie listy parametrów funkcji. Oznacza to, że funkcja nie powinna wywierać wyjątku. Jeśli funkcja rzuci wyjątek, podobnie jak w tym przypadku, skompiluje z komunikatem ostrzegawczym, ale nie będzie działać. Próba uruchomienia programu wywoła specjalną funkcję STD :: terminate (), która powinna zatrzymać program z wdziękiem, zamiast po prostu umożliwić dosłownie awarię.
Specyfikator No -Except jest w różnych formach. Są to następujące:
Type Func () noExcept; : nie pozwala na wyrażenie rzutówPrawda lub fałsz w nawiasach można zastąpić wyrażeniem, które powoduje prawdziwe lub fałszywe.
Funkcja Special STD :: Terminate ():
Jeśli nie można rozwiązać wyjątku, należy go ponownie wyrzucić. W takim przypadku wyrażenie wyrzucone może, ale nie musi mieć operandu. Specjalna funkcja std :: terminate () zostanie wywołany w czasie wykonywania, co powinno zatrzymać program z wdziękiem.
Wpisz, skompiluj i uruchom następujący program:
#włączaćPo udanej kompilacji program zakończył się bez uruchomienia, a komunikat o błędzie z komputera autora jest:
„Zakończenie wezwane po rzuceniu instancją„ int ”
Przerwane (zrzucone rdzeń) ”
Wniosek:
Funkcja wyjątku w C ++ zapobiega wykonywaniu segmentu kodu na podstawie pewnego rodzaju danych wejściowych. Program nadal wykonuje się w razie potrzeby. Konstrukt wyjątku (zapobieganie błędom) polega na blokie próbnym i bloku catch. Block Try ma segment zainteresowania kodu, który można ominąć, w zależności od pewnych warunków wejściowych. Block Try ma wyrażenie rzutów, które rzuca operand. Ten operand jest również nazywany wyjątkiem. Jeśli typ operand i typ parametru bloku połowowego są takie same, wówczas wyjątek zostaje złapany (obsługiwany). Jeśli wyjątek nie zostanie złapany, program zostanie zakończony, ale nadal bądź bezpieczny, ponieważ segment kodu, który miał zostać wykonany w celu uzyskania niewłaściwego wyniku, nie został wykonany. Typowa obsługa wyjątków oznacza ominięcie segmentu kodu i wysyłanie komunikatu o błędzie do użytkownika. Segment kodu jest wykonywany dla normalnych danych wejściowych, ale pomijany dla niewłaściwych wejść.