Wat zijn enkele voorbeelden van run-time fouten in C ++?


Beste antwoord

Er zijn twee mogelijke definities:

In algemene voorwaarden ,

Een runtime-fout is een ongeldige bewerking die optreedt tijdens de uitvoering van een programma dat tijdens het compileren niet kan worden gedetecteerd.

Beschouw dit bijvoorbeeld

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

}

Dit programma is "goed gevormd": de compiler kan het succesvol vertalen en het besturingssysteem voert het met succes uit.

En als u twee door spaties gescheiden gehele getallen typt wanneer dat nodig is, wordt het integrale quotiënt afgedrukt zoals het hoort te doen.

Maar als u typt "0" als een tweede nummer, of als u iets typt als wat dan ook t is geen getal of kan niet worden geparseerd als een getal, je krijgt een geheel getal gedeeld door 0. Iets wat de CPU niet kan en waarvoor een interruptsignaal wordt uitgezonden in de verwachting dat er iets op reageert. (De standaardreactie van het besturingssysteem is het doorgeven van het signaal aan het programma, waar de standaard CRT-signaalhandler "terminate ()" aanroept.

In Specifieke C ++ term : een runtime-fout is elke instantie van welke klasse dan ook die is afgeleid van std::runtime\_error gegeven aan een throw -instructie.

Welke functie een operatie ook ontdekt die niet kan worden voltooid zoals verwacht, zou een dergelijke uitzondering moeten genereren, zodat de beller de fout kan beheren.

Laten we nu proberen om wat "voorzichtiger" te zijn:

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

}

}

}

U kunt zie de div -functie die de deling daadwerkelijk uitvoert. Het kan het "0" deler-geval filteren, maar kan het probleem niet zelf corrigeren (het heeft geen idee over "waarom" de deler 0 is, dus het kan geen specifieke actie ondernemen: het "rapporteert" zijn fout in de vorm van een uitzondering.

De vorige main, bevindt zich nu in een try -blok. Als er geen uitzonderingen worden gegenereerd, gedraagt ​​het zich als de vorige.

Als een uitzondering wordt gegenereerd, wordt de scope verlaten, maar het catch-blok zal een informatiebericht afdrukken, de "slechte invoer" opschonen (het reset de statusvlaggen - dus het verwijderen van wat dan ook fail bit in cin staat, en negeer dan de "domme karakters" tot een redelijk punt - de volgende \ n) en laat de wrapping-lus opnieuw uitvoeren.

Answer

Runtimefouten zijn fouten die optreden wanneer het programma wordt uitgevoerd. Ze kunnen van verschillende typen zijn, waaronder:

  • Logische fouten: wanneer het programma een uitvoer genereert die verschilt van de verwachte uitvoer. Bijv. - Je maakt een programma om twee getallen toe te voegen, maar per ongeluk geef je een - teken in plaats van een + teken.
  • Geheugenlekken: het programma gebruikt continu RAM en voorkomt dat geheugenlocaties één keer voor andere taken worden gebruikt hun werk zit erop. Het uitvoeren van oneindige lussen of het niet ongedaan maken van de toewijzing van gebruikt geheugen kan deze veroorzaken.
  • Crashes: ze kunnen verschillende redenen hebben, zoals:
  • Verwijzen naar ontbrekende bestanden. U wilt een afbeelding weergeven, maar u geeft het verkeerde pad ernaartoe, het programma zal het niet vinden en crashen.
  • Dingen door nul delen. We zeggen simpelweg dat alles gedeeld door 0 niet gedefinieerd is. Programmas zijn niet zo slim en lopen in de war.
  • De verkeerde input geven. Ooit geprobeerd een teken in een integer-variabele in te voeren tijdens het uitvoeren van een programma? Zo ja, dan weet u wat er gebeurt.etc.

Hoop dat dit heeft geholpen ...

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *