Hva er noen eksempler på kjøretidsfeil i C ++?


Beste svaret

Det er to mulige definisjoner:

I generelle vilkår ,

En kjøretidsfeil er en ugyldig operasjon som skjer under kjøringen av et program som ikke kan oppdages på kompileringstidspunktet.

Tenk for eksempel på dette

#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;

}

Dette programmet er “godt formet”: kompilatoren kan oversette det og OS kjører det vellykket.

Og hvis du skriver inn to mellomromsskilte heltall når det er nødvendig, skriver det ut den integrerte kvotienten som den skal.

Men hvis du skriver “0” som andre nummer, eller hvis du skriver noe som hva som helst t er ikke et tall eller kan ikke analyseres som et tall, vil du ende opp med et helt tall divisjon med 0. Noe CPU ikke kan gjøre og som det avgis et avbruddssignal for å forvente at noe skal reagere på det. (Standardreaksjonen fra operativsystemet er å sende signalet til programmet, der CRT-standardsignalbehandleren kaller "terminate ()".

I Spesifikk C ++ begrep : En kjøretidsfeil er uansett forekomst av hvilken klasse som kommer fra std::runtime\_error gitt til en throw uttalelse.

Uansett hvilken funksjon som oppdager en operasjon som ikke kan fullføres som forventet, bør kaste et unntak som det, slik at den som ringer kan håndtere feilen.

La oss nå prøve å være mer "skånsomme":

#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);

}

}

}

Du kan se div -funksjonen som faktisk gjør divisjonen. Den kan filtrere skillelinjen "0", men kan ikke løse problemet i seg selv (den har ingen anelse om "hvorfor" deleren er 0, så den kan ikke ta noen spesifikke handlinger: den "rapporterer" at den er feil i form av en unntak.

Den forrige main er nå inne i en try -blokk. Hvis det ikke kastes noen unntak, oppfører den seg som den forrige.

Hvis et unntak kastes, avsluttes omfanget, men fangstblokken vil skrive ut en informasjonsmelding, rydde opp i "dårlig input" (den tilbakestiller statens flagg - dermed fjerne uansett fail bit i cin tilstand, enn ignorere de "dumme tegnene" opp til et rimelig punkt - neste \ n) og la innpakningssløyfen kjøre på nytt.

Svar

Runtime-feil er feil som oppstår når programmet kjører. De kan være av forskjellige typer som inkluderer:

  • Logiske feil: Når programmet genererer en utgang som er forskjellig fra forventet utgang. F.eks. - Du lager et program for å legge til to tall, men ved en feiltakelse gir du et - tegn i stedet for + - tegnet.
  • Minnelekkasjer: Programmene bruker kontinuerlig RAM og forhindrer at minneplasser brukes til andre oppgaver en gang arbeidet deres er ferdig. Å kjøre uendelige løkker eller ikke plassere brukt minne kan forårsake dem.
  • Krasjer: De kan skyldes mange grunner som:
  • Henvisning til manglende filer. Du vil vise et bilde, men gi feil vei til det. Programmet finner det ikke og krasjer.
  • Deler ting med null. Vi sier ganske enkelt at alt delt på 0 ikke er definert. Programmene er ikke så smarte og går i orden.
  • Gi feil input. Har du noen gang prøvd å skrive inn et tegn i en heltallvariabel under programkjøringen? Hvis ja, vet du hva som skjer.osv.

Håper det hjalp ...

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *