Bästa svaret
Det finns två möjliga definitioner:
I allmänna villkor ,
Ett runtime-fel är en ogiltig åtgärd som inträffar under körningen av ett program som vid kompileringstid inte kan detekteras.
Tänk till exempel på detta
#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;
}
Detta program är "välformerat": kompilatorn kan framgångsrikt översätta det och operativsystemet kör det framgångsrikt.
Och om du skriver två mellanslag-separata heltal när det behövs skriver det ut den integrerade kvoten som den ska göra.
Men om du skriver "0" som ett andra nummer, eller om du skriver något som vad som helst t är inte ett tal eller kan inte analyseras som ett tal, du kommer att sluta med ett heltal med 0. Något som CPU inte kan göra och för vilken en avbrottssignal avges och förväntar sig att något ska reagera på det. (Standardreaktionen från operativsystemet är att skicka signalen till programmet, där CRT-standardsignalhanteraren kallar ”terminate ()”.
I Specifik C ++ term : Ett runtime-fel är vilken instans av vilken klass som helst som härrör från std::runtime\_error
som ges till ett throw
-uttalande.
Oavsett vilken funktion som upptäcker att en åtgärd som inte kan slutföras som förväntat ska ett sådant undantag göras, så att den som ringer kan hantera misstaget.
Nu ska vi försöka vara mer "skonsamma": / p>
#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);
}
}
}
Du kan se funktionen div
som faktiskt gör uppdelningen. Det kan filtrera "0" divisor fallet, men kan inte i sig korrigera problemet (det har ingen aning om "varför" divisor är 0, så det kan inte vidta någon specifik åtgärd: det "rapporterar" det är fel i form av en undantag.
Det föregående main
är nu inne i ett try
-block. Om inga undantag kastas beter sig det som det föregående.
Om ett undantag kastas avslutas räckvidden, men fångstblocket kommer att skriva ut ett informationsmeddelande, rensa den "dåliga inmatningen" (den återställer tillståndsflaggorna - alltså ta bort vilken fail
-bit som helst i cin
än att ignorera de "dumma tecknen" upp till en rimlig punkt - nästa \ n) och låt lindningsslingan köras igen.
Svar
Runtime-fel är fel som uppstår när programmet körs. De kanske av olika typer som inkluderar:
- Logiska fel: När programmet genererar en utdata som skiljer sig från den förväntade utgången. Till exempel - Du skapar ett program för att lägga till två nummer men av misstag ger du ett - tecken istället för + - tecken.
- Minnesläckor: Programmen använder kontinuerligt RAM och förhindrar att minnesplatser används för andra uppgifter en gång deras arbete är klart. Att köra oändliga slingor eller inte omplacera använt minne kan orsaka dem.
- Kraschar: De kan bero på många anledningar som:
- Hänvisar till saknade filer. Du vill visa en bild men ge fel väg till den, programmet hittar den inte och kraschar.
- Dela upp saker med noll. Vi säger helt enkelt att allt dividerat med 0 inte definieras. Programmen är inte så smarta och går haywire.
- Ge fel inmatning. Har du någonsin försökt att ange ett tecken i en heltalsvariabel under programkörningen? Om ja, vet du vad som händer.etc.
Hoppas det hjälpte ...