Usamos el Manejo de Excepciones para superar las excepciones que ocurren en la ejecución de un programa de manera sistemática.
Dividir un número por cero es un error matemático (no definido) y podemos usar el manejo de excepciones para superar con gracia tales operaciones. Si escribe un código sin usar el manejo de excepciones, el resultado de la división por cero se mostrará como infinito, lo que no se puede procesar más.
Considere el código que se proporciona a continuación, la función División devuelve el resultado del numerador dividido por el denominador que se almacena en el resultado de la variable en la pantalla principal y luego se muestra. Esta función de división no tiene ninguna reflexión para que el denominador sea cero.
// Program to show division without using // Exception Handling #include <iostream> using namespace std; // Defining function Division float Division(float num, float den) { // return the result of division return (num / den); } // end Division int main() { // storing 12.5 in numerator // and 0 in denominator float numerator = 12.5; float denominator = 0; float result; // calls Division function result = Division(numerator, denominator); // display the value stored in result cout << "The quotient of 12.5/0 is " << result << endl; } // end main
The quotient of 12.5/0 is inf
Podemos manejar esta excepción de varias maneras diferentes, algunas de las cuales se enumeran a continuación
- 1) Usando la clase runtime_error
La clase runtime_error es una clase derivada de la excepción de clase de la biblioteca estándar, definida en el archivo de encabezado de excepción para representar errores de tiempo de ejecución.
Ahora consideramos exactamente el mismo código pero incluido con el manejo de la posibilidad de división por cero. Aquí tenemos el bloque try dentro de main que llama a la función División. La función División comprueba si el denominador pasado es igual a cero, si no, devuelve el cociente, si es así, lanza una excepción runtime_error. Esta excepción es capturada por el bloque catch que imprime el mensaje «Se produjo una excepción» y luego llama a la función what con el objeto runtime_error e. La función what() {usada en el código que se proporciona a continuación} es una función virtual de la excepción estándar de clase definida en el archivo de encabezado stdexcept, se usa para identificar la excepción. Esto imprime el mensaje «Error matemático: se intentó dividir por cero», después de lo cual el programa reanuda la secuencia ordinaria de instrucciones.// Program to depict how to handle
// divide by zero exception
#include <iostream>
#include <stdexcept> // To use runtime_error
using
namespace
std;
// Defining function Division
float
Division(
float
num,
float
den)
{
// If denominator is Zero
// throw runtime_error
if
(den == 0) {
throw
runtime_error(
"Math error: Attempted to divide by Zero\n"
);
}
// Otherwise return the result of division
return
(num / den);
}
// end Division
int
main()
{
float
numerator, denominator, result;
numerator = 12.5;
denominator = 0;
// try block calls the Division function
try
{
result = Division(numerator, denominator);
// this will not print in this example
cout <<
"The quotient is "
<< result << endl;
}
// catch block catches exception thrown
// by the Division function
catch
(runtime_error& e) {
// prints that exception has occurred
// calls the what function
// using runtime_error object
cout <<
"Exception occurred"
<< endl
<< e.what();
}
}
// end main
Producción:Exception occurred Math error: Attempted to divide by Zero
- 2) Uso del manejo de excepciones definido por el usuario
Aquí definimos una excepción de clase que hereda públicamente de la clase runtime_error. Dentro de la excepción de clase, definimos solo un constructor que mostrará el mensaje «Error matemático: se intentó dividir por cero» cuando se invocó usando el objeto de clase. Definimos la función División que llama al constructor de la clase Excepción cuando el denominador es cero, de lo contrario, devuelve el cociente. Dentro de main le damos algunos valores al numerador y al denominador, 12.5 y 0 respectivamente. Luego llegamos al bloque try que llama a la función División que devolverá el cociente o lanzará una excepción. El bloque catch detecta la excepción de tipo Excepción, muestra el mensaje «Se produjo una excepción» y luego llama a la función what. Una vez que se maneja la excepción, el programa se reanuda.
// Program to depict user defined exception handling
#include <iostream>
#include <stdexcept>
// For using runtime_error
using
namespace
std;
// User defined class for handling exception
// Class Exception publicly inherits
// the runtime_error class
class
Exception :
public
runtime_error {
public
:
// Defining constructor of class Exception
// that passes a string message to the runtime_error class
Exception()
: runtime_error(
"Math error: Attempted to divide by Zero\n"
)
{
}
};
// defining Division function
float
Division(
float
num,
float
den)
{
// If denominator is Zero
// throw user defined exception of type Exception
if
(den == 0)
throw
Exception();
// otherwise return the result of division
return
(num / den);
}
// end Division
int
main()
{
float
numerator, denominator, result;
numerator = 12.5;
denominator = 0;
// try block calls the Division function
try
{
result = Division(numerator, denominator);
// this will not print in this example
cout <<
"The quotient is "
<< result << endl;
}
// catch block catches exception if any
// of type Exception
catch
(Exception& e) {
// prints that exception has occurred
// calls the what function using object of
// the user defined class called Exception
cout <<
"Exception occurred"
<< endl
<< e.what();
}
}
// end main
Producción:Exception occurred Math error: Attempted to divide by Zero
- 3) Usar el desenrollado de pilas
En el desenredado de la pila, tenemos el main dentro del cual el bloque try llama a la función Division que a su vez llama a la función CheckDenominator. La función CheckDenominator verifica si el denominador es cero, si es verdadero arroja una excepción; de lo contrario, devuelve el valor del denominador. La función de división calcula el valor del cociente {si se pasó un valor distinto de cero del denominador} y lo devuelve al principal. El bloque catch detecta cualquier excepción lanzada y muestra el mensaje «Se produjo una excepción» y llama a la función what que imprime «Error matemático: se intentó dividir por cero». Después de esto, el programa se reanuda.
// Program to depict Exception Handling
// Using stack unwinding
#include <iostream>
#include <stdexcept>
using
namespace
std;
// defining the CheckDenominator function
float
CheckDenominator(
float
den)
{
// if denominator is zero
// throw exception
if
(den == 0) {
throw
runtime_error(
"Math error: Attempted to divide by zero\n"
);
}
else
return
den;
}
// end CheckDenominator
// defining Division function
float
Division(
float
num,
float
den)
{
// Division function calls CheckDenominator
return
(num / CheckDenominator(den));
}
// end Division
int
main()
{
float
numerator, denominator, result;
numerator = 12.5;
denominator = 0;
// try block calls the Division function
try
{
result = Division(numerator, denominator);
// This will not print in this example
cout <<
"The quotient is "
<< result << endl;
}
// catch block catches exception if any
catch
(runtime_error& e) {
// prints that exception has occurred
// calls the what function using object of
// runtime_error class
cout <<
"Exception occurred"
<< endl
<< e.what();
}
}
// end main
Producción:Exception occurred Math error: Attempted to divide by zero
- 4) Usar probar y atrapar (…)
En este código, el bloque try llama a la función CheckDenominator. En la función CheckDenominator verificamos si el denominador es cero, si es verdadero lanza una excepción al pasar una string «Error». Esta string es capturada por el bloque catch y, por lo tanto, imprime el mensaje «Se produjo una excepción». El bloque catch aquí es capaz de capturar excepciones de cualquier tipo.
// Program to depict use of try catch block
#include <iostream>
#include <stdexcept>
using
namespace
std;
// defining CheckDenominator
float
CheckDenominator(
float
den)
{
if
(den == 0)
throw
"Error"
;
else
return
den;
}
// end CheckDenominator
int
main()
{
float
numerator, denominator, result;
numerator = 12.5;
denominator = 0;
// try block
try
{
// calls the CheckDenominator function
// by passing a string "Error"
if
(CheckDenominator(denominator)) {
result = (numerator / denominator);
cout <<
"The quotient is "
<< result << endl;
}
}
// catch block
// capable of catching any type of exception
catch
(...) {
// Display a that exception has occurred
cout <<
"Exception occurred"
<< endl;
}
}
// end main
Producción:Exception occurred
Publicación traducida automáticamente
Artículo escrito por ManasiKirloskar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA