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!
#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.
#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);
}
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
Cita de: ivancea96 en 7 Junio 2015, 03:07 AM
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>. ;-)