Nejlepší odpověď
Existují dvě možné definice:
V obecné podmínky ,
Chyba běhového prostředí je neplatná operace, ke které dojde během provádění programu a kterou nelze v době kompilace zjistit.
Zvažte například toto
#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;
}
Tento program je „dobře vytvořený“: překladač jej může úspěšně přeložit a operační systém jej úspěšně provede.
A pokud v případě potřeby zadáte dvě celá čísla oddělená mezerou, vytiskne integrální kvocient tak, jak má být.
Ale pokud zadáte „0“ jako druhé číslo, nebo pokud napíšete něco jako cokoli jiného t není číslo nebo jej nelze analyzovat jako číslo, skončíte s celočíselným dělením číslem 0. Něco, co CPU nedokáže, a pro které je vydán signál přerušení, očekávající, že na něj něco zareaguje. (Standardní reakcí z OS je předání signálu do programu, kde výchozí obsluha signálu CRT volá „terminate ()“.
V Specifickém C ++ term : Chyba za běhu je jakákoli instance jakékoli třídy odvozená z std::runtime\_error
dané throw
příkazu.
Ať už funkce zjistí operaci, kterou nelze dokončit podle očekávání, měla by vyvolat takovou výjimku, aby volající mohl chybu spravovat.
Zkusme tedy být „jemnější“:
#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);
}
}
}
Můžete viz funkce div
, která dělení skutečně provádí. Může filtrovat případ dělitele „0“, ale nemůže sám problém napravit (nemá ponětí o tom, „proč“ je dělitel 0, takže nemůže podniknout žádnou konkrétní akci: „hlásí“ jeho selhání ve formě výjimka.
Předchozí main
je nyní uvnitř bloku try
. Pokud nejsou vyvolány žádné výjimky, chová se jako předchozí.
Pokud je vyvolána výjimka, obor je ukončen, ale blok catch vytiskne informační zprávu, vyčistí „špatný vstup“ (resetuje státní příznaky - tedy odstranění jakéhokoli fail
bitu ve cin
stavu, než ignorování „hloupých znaků“ do rozumného bodu - další \ n) a nechte smyčku zalomení znovu spustit.
Odpovědět
Chyby běhového prostředí jsou chyby, ke kterým dochází při spuštění programu. Mohou se jednat o různé typy, které zahrnují:
- Logické chyby: Když program vygeneruje výstup, který se liší od očekávaného výstupu. Např. - vytvoříte program pro přidání dvou čísel, ale omylem místo znaménka + dáte znaménko -.
- Nevracení paměti: Programy neustále využívají RAM a zabraňují tomu, aby byla paměťová místa jednou použita pro jiné úkoly. jejich práce je hotová. Může to způsobit spuštění nekonečných smyček nebo nevyřazení použité paměti.
- Selhání: Může to být způsobeno mnoha důvody, například:
- Odkazování na chybějící soubory. Chcete zobrazit obrázek, ale poskytnout k němu nesprávnou cestu, program jej nenajde a selže.
- Dělení věcí nulou. Jednoduše řekneme, že nic děleno 0 není definováno. Programy nejsou tak chytré a fungují hůře.
- Nesprávný vstup. Už jste někdy zkoušeli během běhu programu zadat znak do celočíselné proměnné? Pokud ano, víte, co se stane.atd.
Doufám, že to pomohlo ...