Cel mai bun răspuns
Există două definiții posibile:
În termeni generali ,
O eroare de execuție este o operațiune nevalidă care se întâmplă în timpul executării unui program care, în timpul compilării, nu poate fi detectată.
De exemplu, luați în considerare acest lucru
#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;
}
Acest program este „bine format”: compilatorul îl poate traduce cu succes și sistemul de operare îl execută cu succes.
Și dacă tastați două numere întregi separate prin spațiu atunci când este necesar, acesta imprimă coeficientul integral așa cum ar trebui să facă.
Dar, dacă tastați „0” ca al doilea număr sau dacă introduceți ceva ca orice lucru ar fi t nu este un număr sau nu poate fi analizat ca un număr, veți ajunge la o divizare întreagă la 0. Ceva ce CPU nu poate face și pentru care se emite un semnal de întrerupere așteptând să reacționeze ceva. (Reacția standard de la sistemul de operare este transmiterea semnalului către program, unde apelul CRT implicit de manipulare a semnalului „terminate ()”.
În Specific C ++ termen : o eroare de execuție este orice instanță din orice clasă derivată din std::runtime\_error
dată unei declarații throw
.
Orice funcție descoperă o operație care nu poate fi finalizată așa cum era de așteptat ar trebui să arunce o excepție de genul acesta, pentru a permite apelantului să gestioneze greșeala.
Acum, să încercăm să fim mai „blândi”:
#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);
}
}
}
Puteți vezi funcția div
care face efectiv împărțirea. Poate filtra cazul divizorului „0”, dar nu poate corecta singur problema (nu are nicio idee despre „de ce” divizorul este 0, deci nu poate întreprinde nicio acțiune specifică: „raportează” că eșuează sub forma unui excepție.
main
anterior se află acum într-un bloc try
. Dacă nu sunt aruncate excepții, acesta se comportă ca și cea anterioară.
Dacă se aruncă o excepție, scopul este ieșit, dar blocul de captură va imprima un mesaj informativ, curăță „intrarea greșită” (resetează steagurile de stat - astfel eliminarea oricărui fail
bit în starea cin
, decât ignorarea „caracterelor stupide” până la un punct rezonabil - următorul \ n) și lăsați bucla de împachetare să se execute din nou.
Răspundeți
Erorile de execuție sunt erori care apar atunci când programul rulează. Acestea pot fi de diferite tipuri, care includ:
- Erori logice: Când programul generează o ieșire diferită de ieșirea așteptată. De ex. - Faceți un program pentru adăugarea a două numere, dar din greșeală dați un semn - în loc de + semn.
- Scurgeri de memorie: programele utilizează în mod continuu RAM și împiedică utilizarea locațiilor de memorie pentru alte sarcini o dată munca lor este terminată. Rularea unor bucle infinite sau nealocarea alocării memoriei utilizate le pot provoca.
- Blocări: Acestea se pot datora multor motive, cum ar fi:
- Referirea la fișierele lipsă. Doriți să afișați o imagine, dar furnizați o cale greșită către aceasta, programul nu o va găsi și se va bloca.
- Împărțirea lucrurilor la zero. Pur și simplu spunem că orice lucru împărțit la 0 nu este definit. Programele nu sunt atât de inteligente și devin neplăcute.
- Oferind informații greșite. Ați încercat vreodată să introduceți un caracter într-o variabilă întreagă în timpul rulării programului? Dacă da, știi ce se întâmplă.etc.
Speranță care a ajutat ...