• Lunes 16 de Diciembre de 2024, 03:50

Autor Tema:  Duda Sobre Manejo De Errores  (Leído 3589 veces)

erhshut

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Duda Sobre Manejo De Errores
« en: Domingo 17 de Septiembre de 2006, 00:44 »
0
Hola, este es mi primer mensaje y espero tener suerte.

Tengo el siguiente programa en c++ que arroja un error de acceso a memoria

#include <stdio.h>
int main(int argc, char* argv[])
{
int enteros[4], *ptr=enteros;

while(true){
*ptr=0;
ptr++;
}//while
}//main

el error ocurre porque el puntero ptr se sale del arreglo enteros. Mi intencion no es solucionar el error, si no que intentar detectarlo y tomar alguna decision cuando el error ocurra. Mi pregunta es ¿es posible incluir algun bloque (por ejemplo try-catch) que me permita manejar el error, y si es asi, como quedaria?

Por si sirve de algo, el programa lo hago en borland c++5 y en win 2000/XP.

Saludos.
erhshut

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #1 en: Domingo 17 de Septiembre de 2006, 14:01 »
0
tiene mas pinta de ser un codigo de C que de C++, y segundo ese while es infinito. Especifica que queres hacer exactamente asi te podemos ayudar. Por lo que entendi queres a traves del puntero poner en 0 todos los elementos del array?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #2 en: Domingo 17 de Septiembre de 2006, 14:49 »
0
Código: Text
  1.  
  2.   try
  3.   {
  4.     char *ptr = 0;
  5.     *ptr = 55;
  6.   }
  7.   catch(...)
  8.   {
  9.     printf(&#34;doh&#34;);
  10.   }
  11.  
  12.  

PD. La pregunta esta clarisima.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

erhshut

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #3 en: Lunes 18 de Septiembre de 2006, 05:21 »
0
Hola! Gracias por sus respuesta, pero sigo con la duda:

El codigo que puse fue sólo para "fabricar" el error, y lo que hace es inicializar el arreglo con ceros (0) pero (ya que el loop es infinito) el programa intenta escribir sobre memoria que "no le pertenece", nuevamente mi intencion no es corregir el error sino que tomar alguna acción para cuando algo así ocurra.

Eternal Idol: Ejecute tu codigo con C++builder 5 (despues de agregar los encabezados y todo eso) y por lo que vi, defines un puntero a char y le asignas la direccion de memoria 0, luego intentas escribir en dicha direccion y obtengo nuevamente un error de acceso de memoria porque esa direccion de memoria "no me pertenece", es exactamente el error que "fabriqué" en mi codigo pero el problema es que tu codigo al igual que el mio simplemente se cae y no alcanza a entrar al "catch", por lo que no puedo tomar ninguna accion.

En realidad mi problema es mucho mas complicado. Tengo un programa en C++ que llama a algunas dlls y resulta que por errores en los codigos de dichas dlls se generan errores de acceso de memoria y todo el programa se cae, lo cual es grave puesto que el programa funciona como servidor y debe estar siempre "arriba". Por ejemplo, una parte del codigo actualmente es así:

Código: Text
  1. T=rutina_dll( parametros_de_entrada );
  2. if( T != 1 )
  3. {
  4.     printf(&#34;&#092;t Fallo en rutina_dll &#092;n&#34;);                        
  5. }
  6.  
  7.  
la "rutina_dll" retorna un 1 si es realizada con exito y otro numero cuando ALGUN ERROR ES DETECTADO, el problema es que aún tiene errores que no se han detectado y cuando estos ocurren simplemente el programa se cae. Ahora por fin mi pregunta:

¿puedo hacer algo como

Código: Text
  1. try
  2. {
  3.     T=rutina_dll( parametros_de_entrada );
  4. }
  5. catch
  6. {
  7.     //se entraria al catch cuando se produzca un error que no esta considerado en el
  8.     //codigo de la dll
  9.     printf(&#34;error desconocido&#34;);
  10. }
  11.  
para poder manejar cualquier error en las dlls?

¿o como puedo arreglar el codigo que puse al inicio de este hilo, para despues yo tratar de arreglar mi problema real?

Saludos y gracias nuevamente.
erhshut.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #4 en: Lunes 18 de Septiembre de 2006, 08:05 »
0
Cita de: "erhshut"
Eternal Idol: Ejecute tu codigo con C++builder 5 (despues de agregar los encabezados y todo eso) y por lo que vi, defines un puntero a char y le asignas la direccion de memoria 0, luego intentas escribir en dicha direccion y obtengo nuevamente un error de acceso de memoria porque esa direccion de memoria "no me pertenece", es exactamente el error que "fabriqué" en mi codigo pero el problema es que tu codigo al igual que el mio simplemente se cae y no alcanza a entrar al "catch", por lo que no puedo tomar ninguna accion.
Y bueno ... lo lamento si tenes que usar ese compilador ... con VC++ funciona perfectamente y ves el doh en pantalla ...

Esto deberia funcionar siempre:
try {}
catch(...) { }

Fijate si en el Builder tenes alguna opcion con respecto al manejo de excepciones ... de otra manera podes fijate si el Builder soporta SEH (no tengo idea).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Duda Sobre Manejo De Errores
« Respuesta #5 en: Lunes 18 de Septiembre de 2006, 20:43 »
0
Cita de: "Eternal Idol"
Y bueno ... lo lamento si tenes que usar ese compilador ... con VC++ funciona perfectamente y ves el doh en pantalla ...
Nop, esto "se cae" en VC++ Express:
Código: Text
  1.  
  2. #include &#60;stdio.h&#62;
  3.  
  4. int main( int argc, char* argv[] ) {
  5.   try
  6.   {
  7.     char *ptr = 0;
  8.     *ptr = 55;
  9.    }
  10.    catch(...)
  11.    {
  12.      printf(&#34;doh&#34;);
  13.    }
  14.  
  15.    return 0;
  16. }
  17.  
  18.  

¿Sabe alguien si hay que activar alguna característica específica? (A ver si encuentro algo en la ayuda).

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #6 en: Lunes 18 de Septiembre de 2006, 20:53 »
0
Acabo de copiar y pegar el codigo ... darle a cl joraca.cpp y veo el doh ... como la logica indica esto funciona perfectamente.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Duda Sobre Manejo De Errores
« Respuesta #7 en: Lunes 18 de Septiembre de 2006, 21:19 »
0
Ok, compilé desde línea de comandos y, efectivamente, el doh aparece.

Por cierto, al compilar (cl main.cpp) me sale este mensaje de advertencia:
Citar
main.cpp(5) : warning C4530: C++ exception handler used, but unwind semantics ar
e not enabled. Specify /EHsc

El cual se elimina con /EHa:

Citar
cl /EHa main.cpp

Ahora, con esto (lo encontré en la ayuda de cl), ya pude hacerlo desde el IDE, hay que agregar /EHa a los parámetros de línea de comandos del compilador, en Propiedades del proyecto -> Configuration Properties -> C/C++ -> Command line ->Additional Options, allí se agrega /EHa (Exception Handling: all).

Y creo que en el Builder debe ser algo similar, el manejo de esta excepción no estará activado por defecto, habrá que activarlo (pero no sé cómo así que a buscar en la ayuda o en el manual :D)

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #8 en: Lunes 18 de Septiembre de 2006, 21:36 »
0
Cita de: "Geo"
El cual se elimina con /EHa:

Ahora, con esto (lo encontré en la ayuda de cl), ya pude hacerlo desde el IDE, hay que agregar /EHa a los parámetros de línea de comandos del compilador, en Propiedades del proyecto -> Configuration Properties -> C/C++ -> Command line ->Additional Options, allí se agrega /EHa (Exception Handling: all).

 
Tambien con /EHsc que figura en el mensaje que comentas ... con el Visual Studio .NET 2003 esta opcion viene por defecto al crear un proyecto de consola ...

Lo mejor es usar las opciones del proyecto>>Generacion de codigo>>Habilitar excepciones de C++ = Si (/EHsc) y no agregar texto en la linea de comandos.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Duda Sobre Manejo De Errores
« Respuesta #9 en: Lunes 18 de Septiembre de 2006, 22:31 »
0
Gracias por el dato de dónde configurar eso :P. Aunque la opción no es /EHsc (con esta el programa aún falla) sino /EHa (allí sale en las opciones):

Enable C++ Exceptions -> Yes With SEH Exceptions (/EHa)

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #10 en: Lunes 18 de Septiembre de 2006, 22:38 »
0
Cita de: "Geo"
Gracias por el dato de dónde configurar eso :P. Aunque la opción no es /EHsc (con esta el programa aún falla) sino /EHa (allí sale en las opciones):
La opcion depende de la version de Visual Studio .NET que tengas ... en el 2003 es la que te digo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Duda Sobre Manejo De Errores
« Respuesta #11 en: Lunes 18 de Septiembre de 2006, 22:44 »
0
Si, debe ser eso :P. Ahora falta que erhshut comente si (y cómo) lo logró activar en el Builder.

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

erhshut

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #12 en: Martes 19 de Septiembre de 2006, 13:39 »
0
Hola a todos:

Les tengo una última pregunta (por ahora)

Lamentablemente no he tenido tiempo suficiente como para revisar las opciones de borland por lo sigue sin funcionarme el bloque try-catch, por esto les quería pedir si pueden verificar por mi si el siguiente código detecta el error provocado por la función "forzar_error"

Código: Text
  1. #include &#60;stdio.h&#62;
  2.  
  3. int forzar_error(int x)
  4. {
  5.     char *ptr = 0;
  6.     *ptr = x;
  7.     return x;
  8. }
  9.  
  10. int main( int argc, char* argv[] ) {
  11.   int a;
  12.   try
  13.   {
  14.     a=forzar_error(3);
  15.    }
  16.    catch(...)
  17.    {
  18.      printf(&#34;doh&#34;);
  19.    }
  20.    return 0;
  21. }
  22.  

Eso, y gracias por sus respuestas, me están siendo de gran ayuda.

Saludos
erhshut.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #13 en: Martes 19 de Septiembre de 2006, 14:17 »
0
Cita de: "erhshut"
pueden verificar por mi si el siguiente código detecta el error provocado por la función "forzar_error"
 
Si, lo detecta y maneja perfectamente.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

erhshut

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #14 en: Sábado 23 de Septiembre de 2006, 00:00 »
0
Ok, problema solucionado, para que el bloque try-catch funcione con c++builder simplemente hay que chequear la opcion "Use VCL" al iniciar una nueva aplicacion.

Saludos
erhshut.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda Sobre Manejo De Errores
« Respuesta #15 en: Sábado 23 de Septiembre de 2006, 00:02 »
0
Cita de: "erhshut"
Ok, problema solucionado, para que el bloque try-catch funcione con c++builder simplemente hay que chequear la opcion "Use VCL" al iniciar una nueva aplicacion.
Genial ... Borland siempre nos da muestras de su gran afan por ser compatibles con el standard  :devil:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.