Migliore risposta
Ci sono due possibili definizioni:
In termini generali ,
Un errore di runtime è unoperazione non valida che si verifica durante lesecuzione di un programma che in fase di compilazione non può essere rilevata.
Ad esempio, considera questo
#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;
}
Questo programma è "ben formato": il compilatore può tradurlo con successo e il sistema operativo lo esegue correttamente.
E se digiti due numeri interi separati da spazi quando richiesto, stampa il quoziente integrale come dovrebbe.
Ma, se digiti "0" come secondo numero, o se digiti qualcosa come qualsiasi cosa che sia t non è un numero o non può essere analizzato come un numero, ti ritroverai con una divisione intera per 0. Qualcosa che la CPU non può fare e per il quale viene emesso un segnale di interruzione aspettandosi che qualcosa reagisca ad esso. (La reazione standard dal sistema operativo è passare il segnale al programma, dove il gestore del segnale predefinito CRT chiama "terminate ()".
In C ++ specifico termine : un errore di runtime è qualsiasi istanza di qualsiasi classe derivata da std::runtime\_error
data a unistruzione throw
.
Qualunque funzione scopra unoperazione che non può essere completata come previsto dovrebbe lanciare uneccezione del genere, per consentire al chiamante di gestire lerrore.
Ora, cerchiamo di essere più "gentili":
#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);
}
}
}
Puoi vedere la funzione div
che esegue effettivamente la divisione. Può filtrare il caso del divisore "0", ma non può correggere da solo il problema (non ha la più pallida idea del "perché" il divisore è 0, quindi non può intraprendere alcuna azione specifica: "segnala" il suo fallimento sotto forma di eccezione.
Il precedente main
, ora si trova allinterno di un blocco try
. Se non vengono generate eccezioni, si comporta come il precedente.
Se viene lanciata uneccezione, lambito viene chiuso, ma il blocco catch stamperà un messaggio informativo, ripulirà l "input errato" (ripristina i flag di stato - quindi rimuovendo qualsiasi fail
bit nello stato cin
, piuttosto che ignorare i "caratteri stupidi" fino a un punto ragionevole - il prossimo \ n e lascia che il ciclo di wrapping venga rieseguito.
Risposta
Gli errori di runtime sono errori che si verificano quando il programma è in esecuzione. Possono essere di diversi tipi che includono:
- Errori logici: quando il programma genera un output diverso dalloutput previsto. Ad esempio, crei un programma per aggiungere due numeri ma per errore dai un segno - invece del segno +.
- Perdite di memoria: il programma utilizza continuamente la RAM e impedisce che le posizioni di memoria vengano utilizzate per altre attività una volta il loro lavoro è finito. Lesecuzione di cicli infiniti o la mancata deallocazione della memoria utilizzata può causarli.
- Arresti anomali: possono essere dovuti a molte ragioni come:
- Riferimento a file mancanti. Vuoi visualizzare unimmagine ma fornisci il percorso sbagliato, il programma non la troverà e si bloccherà.
- Dividendo le cose per zero. Diciamo semplicemente che qualsiasi cosa divisa per 0 non è definita. I programmi non sono così intelligenti e vanno in tilt.
- Dare linput sbagliato. Hai mai provato a inserire un carattere in una variabile intera durante lesecuzione del programma? Se sì, sai cosa succede.ecc.
Spero che questo abbia aiutato ...