Beste Antwort
Es gibt zwei mögliche Definitionen:
In allgemeine Begriffe ,
Ein Laufzeitfehler ist eine ungültige Operation, die während der Ausführung eines Programms auftritt, das zur Kompilierungszeit nicht erkannt werden kann.
Betrachten Sie beispielsweise Folgendes:
#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;
}
Dieses Programm ist "wohlgeformt": Der Compiler kann es erfolgreich übersetzen und Das Betriebssystem führt es erfolgreich aus.
Wenn Sie bei Bedarf zwei durch Leerzeichen getrennte Ganzzahlen eingeben, wird der integrale Quotient wie vorgesehen ausgedruckt.
Wenn Sie jedoch eingeben "0" als zweite Zahl, oder wenn Sie etwas als was auch immer tippen Wenn t keine Zahl ist oder nicht als Zahl analysiert werden kann, erhalten Sie eine ganzzahlige Division durch 0. Dies kann die CPU nicht und für die ein Interrupt-Signal ausgegeben wird, das erwartet, dass etwas darauf reagiert. (Die Standardreaktion des Betriebssystems besteht darin, das Signal an das Programm weiterzuleiten, wo der CRT-Standard-Signalhandler "terminate ()" aufruft.
In Spezifisches C ++ term : Ein Laufzeitfehler ist eine beliebige Instanz einer Klasse, die von std::runtime\_error
abgeleitet ist und einer throw
-Anweisung gegeben wurde.
Welche Funktion auch immer eine Operation entdeckt, die nicht wie erwartet ausgeführt werden kann, sollte eine solche Ausnahme auslösen, damit der Anrufer den Fehler verwalten kann.
Versuchen wir nun, „sanfter“ zu sein:
#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);
}
}
}
Sie können Siehe die Funktion div
, die die Division tatsächlich ausführt. Es kann den Divisor-Fall "0" filtern, aber das Problem nicht selbst beheben (es hat keine Ahnung, warum der Divisor 0 ist, daher kann es keine spezifische Aktion ausführen: Es "meldet" seinen Fehler in Form eines Ausnahme.
Die vorherige main
befindet sich jetzt in einem try
-Block. Wenn keine Ausnahmen ausgelöst werden, verhält sie sich wie die vorherige.
Wenn eine Ausnahme ausgelöst wird, wird der Bereich beendet, aber der catch-Block druckt eine Informationsnachricht aus und bereinigt die „fehlerhafte Eingabe“ (er setzt die Statusflags zurück - also Entfernen Sie das fail
-Bit im cin
-Zustand, und ignorieren Sie dann die "dummen Zeichen" bis zu einem vernünftigen Punkt - dem nächsten \ n). und lassen Sie die Wrapping-Schleife erneut ausführen.
Antwort
Laufzeitfehler sind Fehler, die beim Ausführen des Programms auftreten. Sie können verschiedene Typen haben, darunter:
- Logische Fehler: Wenn das Programm eine Ausgabe generiert, die sich von der erwarteten Ausgabe unterscheidet. Beispiel: Sie erstellen ein Programm zum Hinzufügen von zwei Zahlen, geben jedoch versehentlich ein - -Zeichen anstelle des + -Zeichens an.
- Speicherlecks: Das Programm belegt kontinuierlich RAM und verhindert, dass Speicherorte einmal für andere Aufgaben verwendet werden Ihre Arbeit ist beendet. Das Ausführen von Endlosschleifen oder das Nicht-Freigeben des verwendeten Speichers kann diese verursachen.
- Abstürze: Sie können verschiedene Gründe haben:
- Verweisen auf fehlende Dateien. Wenn Sie ein Bild anzeigen möchten, aber den falschen Pfad angeben, findet das Programm es nicht und stürzt ab.
- Teilen Sie die Dinge durch Null. Wir sagen einfach, dass alles, was durch 0 geteilt wird, nicht definiert ist. Programme sind nicht so schlau und gehen durcheinander.
- Geben Sie die falsche Eingabe. Haben Sie jemals versucht, während des Programmlaufs ein Zeichen in eine Ganzzahlvariable einzugeben? Wenn ja, wissen Sie, was passiert.usw.
Ich hoffe, das hat geholfen ...