Legjobb válasz
Kétféle definíció létezik:
A általános kifejezések ,
A futásidejű hiba egy érvénytelen művelet, amely egy program futtatása során történik, és fordítás közben nem észlelhető.
Fontolja meg például ezt
#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;
}
Ez a program jól formálódott: a fordító sikeresen lefordíthatja és az operációs rendszer sikeresen végrehajtja.
És ha két szóközzel elválasztott egész számot ír be, ha szükséges, akkor az integrált hányadost kinyomtatja, ahogyan kéne.
De ha beírja „0” második számként, vagy ha beírsz valamit, akármi is A t nem szám, vagy nem lehet számként értelmezni, végül 0-val egész számmal osztjuk el. Valami olyasmi, amit a CPU nem tud megtenni, és amiért megszakítási jelet adnak ki, és arra számít, hogy valami reagál rá. (Az operációs rendszer szokásos reakciója a jel továbbítása a programnak, ahol a CRT alapértelmezett jelkezelője „terminate ()”.
In Specifikus C ++ kifejezés : Futásidejű hiba bármely osztály olyan példánya, amely std::runtime\_error
-ből származik, amelyet egy throw
utasításnak adnak.
Bármelyik funkció felfedez egy olyan műveletet, amelyet nem lehet a várakozásoknak megfelelően végrehajtani, ennek kivételt kell tennie, hogy a hívó kezelhesse a hibát.
Most próbáljunk meg „szelídebbek” lenni:
#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);
}
}
}
Megteheti lásd az osztást ténylegesen végrehajtó div
függvényt. Szűrheti a „0” osztó esetet, de önmagában nem tudja kijavítani a problémát (fogalma sincs arról, hogy az osztó miért „0”, ezért nem tud konkrét intézkedéseket végrehajtani: „hibaként” jelenti a hibát. kivétel.
Az előző main
, most egy try
blokkban van. Ha nem dobunk kivételt, akkor viselkedik mint az előző.
Ha kivételt dobunk, a hatókör kilép, de a fogási blokk kiír egy információs üzenetet, kitisztítja a „rossz bemenetet” (alaphelyzetbe állítja az állapotjelzőket - így bármi fail
bit eltávolítása cin
állapotban, mintsem ésszerű pontig figyelmen kívül hagyja a „buta karaktereket” - a következő \ n) és hagyja, hogy a csomagoló hurok újra végrehajtódjon.
Válasz
Az futásidejű hibák olyan hibák, amelyek a program futtatásakor jelentkeznek. Lehet, hogy különböző típusúak, amelyek a következők:
- Logikai hibák: Amikor a program a várt kimenettől eltérő kimenetet generál. Pl. - Készít egy programot két szám hozzáadásához, de tévedésből - - jelet ad a + jel helyett.
- Memóriaszivárgás: A programok folyamatosan felhasználják a RAM-ot, és megakadályozzák, hogy a memóriahelyeket egyszer más feladatokhoz használják. munkájuk befejeződött. Végtelen ciklusok futtatása vagy a használt memória nem osztása okozhatja őket.
- Összeomlások: Ennek számos oka lehet, például:
- hiányzó fájlokra való hivatkozás. Szeretne megjeleníteni egy képet, de rossz elérési utat ad meg hozzá, a program nem találja meg és összeomlik.
- A dolgok nullával való elosztása. Egyszerűen azt mondjuk, hogy bármi, amit elosztunk 0-val, nincs meghatározva. A programok nem annyira okosak, és szétszóródnak.
- Rossz bemenet adása. Megpróbálta már megadni a karaktert egész változóban a program futtatása során? Ha igen, akkor tudja, mi történik.stb.
Remélem, hogy segített ...