Jakie są przykłady błędów czasu wykonania w C ++?


Najlepsza odpowiedź

Istnieją dwie możliwe definicje:

W warunki ogólne ,

Błąd wykonania to nieprawidłowa operacja, która ma miejsce podczas wykonywania programu, którego w czasie kompilacji nie można wykryć.

Rozważmy to na przykład

#incude

int main()

{

int a=0, b=0;

std::cout << "getting the quotient. \n Two numbers, please" << std::endl;

std::cin >> a >> b;

auto z = a/b;

std::cout << "the quotient is" << z << std::endl;

}

Ten program jest „dobrze sformułowany”: kompilator może go z powodzeniem przetłumaczyć i system operacyjny pomyślnie go wykona.

A jeśli wpiszesz dwie liczby całkowite oddzielone spacjami, gdy jest to wymagane, wypisze całkowity iloraz, tak jak powinien.

Ale jeśli wpiszesz „0” jako druga liczba lub jeśli wpiszesz coś jako cokolwiek tha t nie jest liczbą lub nie może być analizowane jako liczba, otrzymasz w wyniku dzielenie liczby całkowitej przez 0. Coś, czego procesor nie może zrobić i dla którego emitowany jest sygnał przerwania, oczekując, że coś na niego zareaguje. (Standardową reakcją systemu operacyjnego jest przekazanie sygnału do programu, w którym domyślny program obsługi sygnału CRT wywołuje „terminate ()”.

W Specyficzne C ++ termin : Błąd wykonania to dowolne wystąpienie dowolnej klasy pochodzącej z std::runtime\_error podane w instrukcji throw .

Jakakolwiek funkcja wykryje operację, której nie można zakończyć zgodnie z oczekiwaniami, powinna zgłosić taki wyjątek, aby umożliwić wywołującemu zarządzanie tym błędem.

Teraz spróbujmy być bardziej „delikatni”:

#include

#include

#include

class divide\_by\_zero: public std::runtime\_error

{ public: using std::runtime\_error::runtime\_error; };

// filter a divide by zero runtime error

auto div(int a, int b)

{

if(!b)

{ throw divide\_by\_zero("attempt to divide by zero"); }

return a/b;

}

// clear a stream status, and discard input up to a "\n"

void discard\_input(std::istream& s)

{

s.clear();

s.ignore(std::numeric\_limits::max(),"\n");

}

int main()

{

for(;;)

{

try

{

int a=0; b=0;

std::cout << "Getting the quotient: Two numbers, please" << std::endl;

std::cin >> a >> b;

auto z = div(a,b);

std::cout << "The quotient is " << z << std::endl;

return 0;

}

catch(std::exception& e) //whatever exception

{

std::cout << "Error in computation: " << e.what() << "\n";

std::cout << "Bad input - retry!" << std::endl;

discard\_input(std::cin);

}

}

}

Możesz zobacz funkcję div, która faktycznie dokonuje podziału. Może filtrować wielkość dzielnika „0”, ale nie może samodzielnie rozwiązać problemu (nie ma pojęcia, „dlaczego” dzielnik ma wartość 0, więc nie może podjąć żadnej konkretnej akcji: „zgłasza” swoją awarię w postaci wyjątek.

Poprzedni main znajduje się teraz w bloku try . Jeśli nie zostanie zgłoszony żaden wyjątek, zachowuje się jak poprzedni.

Jeśli zostanie zgłoszony wyjątek, zasięg zostanie zakończony, ale blok catch wypisze komunikat informacyjny, wyczyści „złe dane wejściowe” (resetuje flagi stanu - w ten sposób usunięcie dowolnego fail bitu w stanie cin , niż zignorowanie „głupich znaków” do rozsądnego punktu - następny „\ n”) i pozwól pętli zawijania na ponowne wykonanie.

Odpowiedź

Błędy w czasie wykonywania to błędy występujące podczas działania programu. Mogą one być różnego typu, na przykład:

  • Błędy logiczne: gdy program generuje dane wyjściowe różniące się od oczekiwanych. Np. - Tworzysz program do dodawania dwóch liczb, ale przez pomyłkę podajesz znak - zamiast znaku +.
  • Wycieki pamięci: Programy w sposób ciągły zużywają pamięć RAM i raz zapobiegają wykorzystaniu miejsc pamięci do innych zadań ich praca jest zakończona. Uruchamianie nieskończonych pętli lub brak zwalniania używanej pamięci może je powodować.
  • Awarie: mogą mieć wiele przyczyn, takich jak:
  • Odwołania do brakujących plików. Chcesz wyświetlić obraz, ale podasz do niego złą ścieżkę, program go nie znajdzie i ulegnie awarii.
  • Dzielenie rzeczy przez zero. Po prostu mówimy, że nic podzielonego przez 0 nie jest zdefiniowane. Programy nie są tak sprytne i szaleją.
  • Podawanie złych danych. Czy próbowałeś kiedyś wprowadzić znak w zmiennej całkowitej podczas wykonywania programu? Jeśli tak, wiesz, co się dzieje.itp.

Mam nadzieję, że pomogło…

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *