Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Usos del try en lugar de if

Estas en el tema de Usos del try en lugar de if en el foro de C/C++ en Foros del Web. Hola amigos, Les traigo una duda luego de ver un código y buscar un poco acerca de los try{} en c++, las "exceptions", exactamente para ...
  #1 (permalink)  
Antiguo 19/11/2015, 08:33
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Usos del try en lugar de if

Hola amigos,

Les traigo una duda luego de ver un código y buscar un poco acerca de los try{} en c++, las "exceptions", exactamente para que sirve, es decir no se puede hacer lo mismo con un if o con un switch?

saludos,
  #2 (permalink)  
Antiguo 19/11/2015, 08:42
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Usos del try en lugar de if

try-catch sirve para la gestión de excepciones. Las excepciones, en el caso de usarlas, únicamente deberían usarse para indicar situaciones anómalas, como por ejemplo que se ha perdido la conexión con la base de datos o que ha habido un problema al reservar memoria para un proceso.

La gracia de usar excepciones es que proporcionas a la aplicación un sistema homogéneo de gestión de errores capaz de proporcionar en tiempo de ejecución mucha más información que un simple return (como en C). La pega es que la gestión de excepciones exige código adicional en las funciones, además de que puedes provocar errores nuevos si no tienes en cuenta las exepciones... como fugas de memoria:

Código C++:
Ver original
  1. int* func()
  2. {
  3.   int* toReturn = new int[10];
  4.   throw "Error";
  5.  
  6.   // Este return no se ejecuta nunca pero la memoria sí que se ha reservado
  7.   return toReturn;
  8. }

El uso de excepciones se puede retorcer hasta el extremo de que podrías usarlas como sustituto del return... pero es desaconsejable por tres razones básicas:

  • no están pensadas para eso
  • Se va a tardar algo más de tiempo en entender el funcionamiento del código
  • El tiempo de ejecución es mayor


Código C++:
Ver original
  1. void suma(int a, int b)
  2. {
  3.   throw a+b;
  4. }
  5.  
  6. int main()
  7. {
  8.   try
  9.   {suma(4,3);}
  10.  
  11.   catch( int resultado )
  12.   { std::cout << "4 + 3 = " << resultado << std::end; }
  13. }

Así que no, try-catch no es un sustituto natural de if o de switch. La primera estructura sirve para la gestión de excepciones y las dos últimas para el control del flujo del programa. Son elementos diferentes con responsabilidades totalmente distintas.

--------------------
EDITO:

¿Qué pueden proporcionar las excepciones que no se pueda conseguir con otras estructuras? Dependiendo de cómo estructures tus excepciones, varias cosas:
  • Claridad en el diseño
  • Mucha información sobre la excepción sin necesidad de depurar
  • otros


Por ejemplo:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3.  
  4. class CustomException
  5. {
  6.   public:
  7.     CustomException(
  8.         const std::string& what,
  9.         const std::string& where,
  10.         int line)
  11.       : _what(what),_where(where),_line(line),_nested(0)
  12.     {
  13.     }
  14.  
  15.     CustomException(
  16.         const std::string& what,
  17.         const std::string& where,
  18.         int line,
  19.         const CustomException& nested)
  20.       : _what(what),_where(where),_line(line),_nested(new CustomException(nested))
  21.     {
  22.     }
  23.  
  24.     CustomException(const CustomException& other)
  25.       : _what(other._what),_where(other._where),_line(other._line),_nested(0)
  26.     {
  27.       if( other._nested)
  28.         _nested = new CustomException(*other._nested);
  29.     }
  30.  
  31.     ~CustomException()
  32.     { delete _nested; }
  33.  
  34.     std::string What() const
  35.     {return _what; }
  36.  
  37.     std::string Where() const
  38.     { return _where; }
  39.  
  40.     int Line() const
  41.     { return _line; }
  42.  
  43.     std::string ToString() const
  44.     {
  45.       std::string toReturn = _what + " in " + _where + ": " + std::to_string(_line) + "\n";
  46.       CustomException* ptr = _nested;
  47.       if( ptr )
  48.         toReturn += "Stack:\n";
  49.  
  50.       while( ptr )
  51.       {
  52.         toReturn += "\t" + ptr->Where() + ":" + std::to_string(ptr->_line) + " - " + ptr->What() + "\n";
  53.         ptr = ptr->_nested;
  54.       }
  55.  
  56.       return toReturn;
  57.     }
  58.  
  59.   private:
  60.     std::string _what;
  61.     std::string _where;
  62.     int _line;
  63.     CustomException* _nested;
  64. };
  65.  
  66. void func3()
  67. {
  68.   throw CustomException("Error X",__FUNCTION__,__LINE__);
  69. }
  70.  
  71. void func2()
  72. {
  73.   try
  74.   {
  75.     func3();
  76.   }
  77.  
  78.   catch( const CustomException& exc )
  79.   {
  80.     throw CustomException("Error raro",__FUNCTION__,__LINE__, exc);
  81.   }
  82. }
  83.  
  84. void func()
  85. {
  86.   try
  87.   {
  88.     func2();
  89.   }
  90.  
  91.   catch( const CustomException& exc )
  92.   {
  93.     throw CustomException("Error muy raro",__FUNCTION__,__LINE__,exc);
  94.   }
  95. }
  96.  
  97. int main()
  98. {
  99.   try
  100.   {
  101.     func();
  102.   }
  103.  
  104.   catch(const CustomException& exc)
  105.   {
  106.     std::cout << exc.ToString() << std::endl;
  107.   }
  108. }

Hacer esto con control de flujo requeriría bastante más esfuerzo y el resultado sería menos elegante.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Última edición por eferion; 19/11/2015 a las 09:06
  #3 (permalink)  
Antiguo 19/11/2015, 09:52
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Usos del try en lugar de if

Muchas gracias, el ultimo ejemplo tengo que digerirlo detalladamente jeje. Por tanto una excepción es una forma de adelantarse a un problema que uno sabe puede ocurrir y decirle al codigo que hacer cuando lo encuentre.

Saludos
  #4 (permalink)  
Antiguo 19/11/2015, 10:04
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Usos del try en lugar de if

Cita:
Iniciado por dmorill Ver Mensaje
Muchas gracias, el ultimo ejemplo tengo que digerirlo detalladamente jeje. Por tanto una excepción es una forma de adelantarse a un problema que uno sabe puede ocurrir y decirle al codigo que hacer cuando lo encuentre.

Saludos
No exactamente. Una excepción es una forma de avisar de que ha ocurrido algo anormal en el programa. La excepción debería contener suficiente información (mediante polimorfismo y métodos) como para identificar el origen del problema... por lo menos hasta un nivel mínimo que permita localizar el origen del problema.

Entonces, la excepción es recuperada por otra sección del código (que de forma directa o indirecta ha llamado al código que ha generado la excepción) y que actúa en consecuencia, ya sea mostrando un mensaje al usuario, abortando la aplicación o el proceso en curso, añadiendo una entrada en un log, ...

Un motivo para las excepciones es permitir que la aplicación se recupere de un error en las mejores condiciones posibles, ya que normalmente los errores se producen en el núcleo y dicha capa de código no es capaz de responder de forma conveniente ante un error. Sin excepciones la solución pasaría por propagar un mensaje de error entre las diferentes capas de código hasta llegar a una capaz de iniciar las acciones que permitan recuperarse del error... con las excepciones este proceso se automatiza.

PD.: el ejemplo anterior lo que propone es una secuencia de excepciones anidadas... al final el main recibe información precisa sobre dónde se ha producido el error (en qué función y en qué línea) y qué ruta de llamadas ha seguido el código para llegar hasta ese error.

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #5 (permalink)  
Antiguo 19/11/2015, 10:26
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Usos del try en lugar de if

Gracias de nuevo, creo que ya lo voy entendiendo.

Por tanto ejemplos que he visto del uso del try (a modo explicativo) como el siguiente, son correctos, pero mal usados, pues no es necesario el uso el try, ya que no se va a incurrir en un error propiamente dicho.

Código C++:
Ver original
  1. int main(){
  2.     try{
  3.         int x;
  4.         cout << "Enter a number from 1 to 10: ";
  5.         cin >> x;
  6.         if (x > 0 && x < 11){
  7.             cout << "Correct number." << endl;
  8.         }else{
  9.             throw x;
  10.         }
  11.     }catch (int y){
  12.         cout << "Incorrect number." << endl;
  13.     }
  14. }


Quizá su uso está reservado a códigos más complejos.

saludos,

Última edición por dmorill; 19/11/2015 a las 10:27 Razón: Ortografía
  #6 (permalink)  
Antiguo 19/11/2015, 10:41
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Usos del try en lugar de if

Exacto. No hay una norma escrita sobre cómo se deben usar las excepciones... es algo libre de cada uno o de la política que te obliguen a llevar en la empresa de turno.

A mi modo de ver las excepciones deben usarse para situaciones como las que te he comentado... aquellas donde el error se genera en una parte del código pero la recuperación correspondiente no se puede realizar sino varias capas por encima.

Piensa también que si se genera una excepción y no la capturas, esta subirá por la pila hasta llegar al main... si ahí sigue sin capturarse el programa terminará con error.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: excepciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:08.