Mitkä ovat esimerkit ajonaikaisista virheistä C ++: ssa?


Paras vastaus

Määritelmiä on kaksi:

yleiset termit ,

Suorituksenaikaiset virheet ovat virheellisiä toimintoja, jotka tapahtuvat ohjelman suorituksen aikana ja jota ei voida havaita kääntämisen aikana.

Harkitse esimerkiksi tätä

#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;

}

Tämä ohjelma on "hyvin muodostettu": kääntäjä voi kääntää sen onnistuneesti ja käyttöjärjestelmä suorittaa sen onnistuneesti.

Ja jos kirjoitat tarvittaessa kaksi välilyönnillä erotettua kokonaislukua, se tulostaa integraalin osamäärän, kuten sen pitäisi tehdä.

Mutta jos kirjoitat "0" toisena numerona tai jos kirjoitat jotain mitä tahansa t ei ole numero tai sitä ei voida jäsentää numerona, päädyt kokonaislukujakaumaan 0: lla. Jotain, jota keskusyksikkö ei voi tehdä ja jolle lähetetään keskeytyssignaali odottaa jotain reagoivan siihen. (OS: n tavanomainen reaktio on siirtää signaali ohjelmalle, jossa CRT: n oletussignaalinkäsittelijän kutsu "lopettaa ()".

Erityinen C ++ termi : Ajonaikainen virhe on mikä tahansa luokan esiintymä, joka on johdettu std::runtime\_error -kohdasta, joka on annettu throw -lausekkeelle.

Riippumatta siitä, mikä toiminto havaitsee toiminnon, jota ei voida suorittaa odotetulla tavalla, pitäisi antaa tällainen poikkeus, jotta soittaja voi hallita virhettä.

Yritetään nyt olla "lempeämpi":

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

}

}

}

Voit katso funktio div, joka todella jakaa. Se voi suodattaa "0" -jakajan tapaus, mutta ei voi itse korjata ongelmaa (sillä ei ole aavistustakaan siitä, miksi jakaja on 0, joten se ei voi tehdä mitään erityisiä toimia: se "ilmoittaa" epäonnistumisestaan ​​muodossa poikkeus.

Edellinen main on nyt try -lohkon sisällä. Jos mitään poikkeuksia ei heitetä, se käyttäytyy kuten edellinen.

Jos poikkeus heitetään, laajuus suljetaan, mutta lukituslohko tulostaa tiedoteviestin, puhdistaa "virheellisen syötteen" (se nollaa valtion liput - täten poistamalla mikä tahansa fail -bitti cin -tilassa, kuin jättää "tyhmät merkit" huomiotta - seuraava \ n) ja anna käärintäsilmukan suorittaa uudelleen.

Vastaus

Suorituksenaikaiset virheet ovat virheitä, jotka tapahtuvat ohjelman ollessa käynnissä. Ne voivat olla erityyppisiä, mukaan lukien:

  • Loogiset virheet: Kun ohjelma tuottaa ulostulon, joka eroaa odotetusta tuotoksesta. Esim. - Teet ohjelman kahden numeron lisäämiseksi, mutta annat vahingossa - merkin + -merkin sijaan.
  • Muistivuodot: Ohjelmat kuluttavat jatkuvasti RAM-muistia ja estävät muistipaikkojen käyttämisen muihin tehtäviin kerran heidän työnsä on valmis. Äärettömien silmukoiden suorittaminen tai käytetyn muistin jakamatta jättäminen voi aiheuttaa niitä.
  • Kaatumiset: Ne voivat johtua monista syistä, kuten:
  • viittaaminen puuttuviin tiedostoihin. Haluat näyttää kuvan, mutta annat väärän polun siihen, ohjelma ei löydä sitä ja kaatuu.
  • Jakamalla asiat nollalla. Sanomme yksinkertaisesti, että mitään, joka on jaettu 0: lla, ei ole määritelty. Ohjelmat eivät ole niin älykkäitä ja menevät hätään.
  • Väärän syötteen antaminen. Oletko koskaan yrittänyt kirjoittaa merkin kokonaislukumuuttujaan ohjelman ajon aikana? Jos kyllä, tiedät mitä tapahtuu.jne.

Toivo, joka auttoi…

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *