Abfangen von Divide-by-Zero-Ausnahmen
Trotz Versuchen, eine Ausnahme mithilfe eines Try/Catch-Blocks abzufangen, umgeht der folgende Code aus unerklärlichen Gründen die Ausnahme bei Division durch Null:
int i = 0; cin >> i; // input validation not present try { i = 5/i; } catch (std::logic_error e) { cerr << e.what(); }
Ausnahmebehandlung in C
Entgegen den Erwartungen ist die Ganzzahldivision durch Null keine eingebaute Ausnahme in Standard-C. Dies gilt auch für Gleitkommadivision/-rest durch Null, obwohl in diesem Fall spezifische rationale Werte wie NaN/Inf resultieren können.
Die Liste der im ISO C 20-Standard definierten Ausnahmen umfasst:
logic_error domain_error invalid_argument length_error out_of_range runtime_error range_error overflow_error underflow_error
Während Argumente dafür vorgebracht werden könnten, overflow_error oder domain_error zu verwenden, um eine Division durch Null anzugeben, gibt der Standard ausdrücklich an, dass das Verhalten in einem solchen Fall undefiniert ist Fälle.
Benutzerdefinierte Ausnahmebehandlung
Wenn eine Division durch Null-Ausnahme gewünscht ist, kann diese manuell implementiert werden. Im folgenden Beispiel wird die intDivEx-Funktion verwendet, um Ganzzahlen mit Ausnahmebehandlung zu dividieren:
inline int intDivEx (int numerator, int denominator) { if (denominator == 0) throw std::overflow_error("Divide by zero exception"); return numerator / denominator; }
Die Ausgabe dieser Funktion zeigt, dass die Ausnahme ausgelöst und abgefangen wird, wobei die ursprüngliche Variable im Falle einer Division durch unberührt bleibt -Null:
i = intDivEx(10, 0); // throws exception i = intDivEx(10, 2); // returns 5
Das obige ist der detaillierte Inhalt vonWarum löst C keine Ausnahme für die Ganzzahldivision durch Null aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!