elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con excepciones C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con excepciones C++  (Leído 1,273 veces)
Gunhack

Desconectado Desconectado

Mensajes: 42



Ver Perfil
Duda con excepciones C++
« en: 6 Junio 2015, 22:55 pm »

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
  1. #include <iostream>
  2. #include <stdexcept>
  3. #include <stdlib.h>
  4. #include <limits>
  5. #include <ios>
  6.  
  7. using namespace std;
  8.  
  9. int read_int(const string &Cad, const int &Min, const int &Max) {
  10.  int x;
  11.  while (true) {
  12.    try {
  13.      cout << Cad;
  14.      cin >> x;
  15.     } catch (ios::failure &ex) {
  16.       cout << "Error en la cadena de numeros, intenta de nuevo.\n";
  17.       cin.clear();
  18.       cin.ignore(numeric_limits<int>::max(),'\n');
  19.    }
  20.    try {
  21.      if(x<Min||x>Max) {
  22.        throw out_of_range("");
  23.      }
  24.      return x;
  25.    } catch (out_of_range &ex) {
  26.       cout << "Error en el intervalo, intenta de nuevo.\n";
  27.       cin.clear();
  28.       cin.ignore(numeric_limits<int>::max(),'\n');
  29.     }
  30.  }
  31.  
  32. }
  33.  
  34. main () {
  35.  cout << read_int("Ingresa un numero entre 4 y 10: ", 4, 10);
  36. }
  37.  



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

Código
  1. #include <iostream>
  2. #include <stdexcept>
  3. #include <stdlib.h>
  4. #include <limits>
  5. #include <ios>
  6.  
  7. using namespace std;
  8.  
  9. int read_int(const string &Cad, const int &Min, const int &Max) {
  10.  cin.exceptions(ios::failbit);
  11.  int x;
  12.  while (true) {
  13.    try {
  14.      cout << Cad;
  15.      cin >> x;
  16.      if(x<Min||x>Max) {
  17.        throw out_of_range("");
  18.      }
  19.     return x;
  20.     } catch (out_of_range &ex) {
  21.       cout << "Error en el intervalo, intenta de nuevo.\n";
  22.       cin.clear();
  23.       cin.ignore(numeric_limits<int>::max(),'\n');
  24.     }catch (ios::failure &ex) {
  25.       cerr << "Error en la cadena de numeros, intenta de nuevo.\n";
  26.       cin.clear();
  27.       cin.ignore(numeric_limits<int>::max(),'\n');
  28.    }
  29.  }
  30. }
  31.  
  32. main () {
  33.  cout << read_int("Ingresa un numero entre 4 y 10: ", 4, 10);
  34. }
  35.  


« Última modificación: 8 Junio 2015, 06:53 am por Eternal Idol » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.411


ASMático


Ver Perfil WWW
Re: Duda con excepciones C++
« Respuesta #1 en: 7 Junio 2015, 03:07 am »

Código
  1. try {
  2.      cout << Cad;
  3.      cin >> x;
  4.      if(x<Min||x>Max) {
  5.        throw out_of_range("");
  6.      }
  7.     return x;
  8.     } catch (out_of_range &ex) {
  9.       cout << "Error en el intervalo, intenta de nuevo.\n";
  10.       cin.clear();
  11.       cin.ignore(numeric_limits<int>::max(),'\n');
  12.     }

¿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


« Última modificación: 7 Junio 2015, 03:10 am por ivancea96 » En línea

Gunhack

Desconectado Desconectado

Mensajes: 42



Ver Perfil
Re: Duda con excepciones C++
« Respuesta #2 en: 7 Junio 2015, 04:48 am »

Código
  1. try {
  2.      cout << Cad;
  3.      cin >> x;
  4.      if(x<Min||x>Max) {
  5.        throw out_of_range("");
  6.      }
  7.     return x;
  8.     } catch (out_of_range &ex) {
  9.       cout << "Error en el intervalo, intenta de nuevo.\n";
  10.       cin.clear();
  11.       cin.ignore(numeric_limits<int>::max(),'\n');
  12.     }

¿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>.  ;-)
« Última modificación: 7 Junio 2015, 04:50 am por Gunhack » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con excepciones.
Java
|Miguel| 0 1,131 Último mensaje 5 Febrero 2012, 19:29 pm
por |Miguel|
Problema con las excepciones
Programación C/C++
amchacon 3 1,268 Último mensaje 28 Enero 2013, 14:50 pm
por amchacon
Problema con Excepciones en C#
.NET (C#, VB.NET, ASP)
ORTUS 2 2,062 Último mensaje 13 Junio 2013, 16:43 pm
por ORTUS
Duda con excepciones en .NET
.NET (C#, VB.NET, ASP)
SARGE553413 3 1,330 Último mensaje 17 Julio 2014, 00:24 am
por elezekiel
Duda con excepciones de c++: ios_base::failure
Programación C/C++
SARGE553413 2 1,086 Último mensaje 27 Julio 2014, 11:44 am
por SARGE553413
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines