Manejo de la excepción Dividir por cero en C++

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
Producción:

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *