Jaké jsou příklady chyb za běhu v C ++?


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

}

}

}

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *