Duda con excepciones C++

Iniciado por Gunhack, 6 Junio 2015, 22:55 PM

0 Miembros y 1 Visitante están viendo este tema.

Gunhack

Buenas, en un ejercicio me piden crear una función con excepciones, una debe lanzar la excepción ios::failure  si el formato ingresado no es válido, y la otra es que el numero ingresado esté fuera del intervalo dado en los parámetros de la función (out_of_range), así como lo tengo funciona, pero quería saber si está en lo correcto o hay una mejor forma de ponerlo (con las mismas excepciones) ya que quiero que cuando ingresen un caracter muestre la excepción failure pero solo toma la que le sigue. Gracias!

Código (cpp) [Seleccionar]

#include <iostream>
#include <stdexcept>
#include <stdlib.h>
#include <limits>
#include <ios>

using namespace std;

int read_int(const string &Cad, const int &Min, const int &Max) {
 int x;
 while (true) {
   try {
     cout << Cad;
     cin >> x;
    } catch (ios::failure &ex) {
      cout << "Error en la cadena de numeros, intenta de nuevo.\n";
      cin.clear();
      cin.ignore(numeric_limits<int>::max(),'\n');
   }
   try {
     if(x<Min||x>Max) {
       throw out_of_range("");
     }
     return x;
   } catch (out_of_range &ex) {
      cout << "Error en el intervalo, intenta de nuevo.\n";
      cin.clear();
      cin.ignore(numeric_limits<int>::max(),'\n');
    }
 }

}

main () {
 cout << read_int("Ingresa un numero entre 4 y 10: ", 4, 10);
}





He modificado el código, ya me lanza correctamente las excepciones, pero aún me queda la duda si es lo correcto.

Código (cpp) [Seleccionar]

#include <iostream>
#include <stdexcept>
#include <stdlib.h>
#include <limits>
#include <ios>

using namespace std;

int read_int(const string &Cad, const int &Min, const int &Max) {
  cin.exceptions(ios::failbit);
  int x;
  while (true) {
    try {
      cout << Cad;
      cin >> x;
      if(x<Min||x>Max) {
        throw out_of_range("");
      }
     return x;
     } catch (out_of_range &ex) {
       cout << "Error en el intervalo, intenta de nuevo.\n";
       cin.clear();
       cin.ignore(numeric_limits<int>::max(),'\n');
     }catch (ios::failure &ex) {
       cerr << "Error en la cadena de numeros, intenta de nuevo.\n";
       cin.clear();
       cin.ignore(numeric_limits<int>::max(),'\n');
    }
  }
}

main () {
  cout << read_int("Ingresa un numero entre 4 y 10: ", 4, 10);
}

ivancea96

#1
Código (cpp) [Seleccionar]
try {
     cout << Cad;
     cin >> x;
     if(x<Min||x>Max) {
       throw out_of_range("");
     }
    return x;
    } catch (out_of_range &ex) {
      cout << "Error en el intervalo, intenta de nuevo.\n";
      cin.clear();
      cin.ignore(numeric_limits<int>::max(),'\n');
    }


¿Para qué tiras esa excepción, pudiendo hacerlo directamente dentro del if? Además de ser más rápido, es también más claro. Si no vas a tirar excepción para fuera de la función, tirar excepción como simple "break" en el código es poco necesario.

Mejor 3 if a 1 try-throw-catch.

Y aprobecho para recordar que <stdlib.h> se puede reemplazar por <cstdlib>, ya que estás con C++.

Y bueno, preferible ponerle tipo de retorno a la función main. Más que nada, para guardar un poco las formas xD

Gunhack

#2
Cita de: ivancea96 en  7 Junio 2015, 03:07 AM
Código (cpp) [Seleccionar]
try {
     cout << Cad;
     cin >> x;
     if(x<Min||x>Max) {
       throw out_of_range("");
     }
    return x;
    } catch (out_of_range &ex) {
      cout << "Error en el intervalo, intenta de nuevo.\n";
      cin.clear();
      cin.ignore(numeric_limits<int>::max(),'\n');
    }


¿Para qué tiras esa excepción, pudiendo hacerlo directamente dentro del if? Además de ser más rápido, es también más claro. Si no vas a tirar excepción para fuera de la función, tirar excepción como simple "break" en el código es poco necesario.

Mejor 3 if a 1 try-throw-catch.

Y aprobecho para recordar que <stdlib.h> se puede reemplazar por <cstdlib>, ya que estás con C++.

Y bueno, preferible ponerle tipo de retorno a la función main. Más que nada, para guardar un poco las formas xD


Es que en el ejercicio del libro venía que lo pusiera así  :xD también se me hizo innecesario pero supongo es para entender como funciona, muchas gracias por tu respuesta! y gracias por lo de <cstdlib>.  ;-)