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
}
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 ...