elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
14 Febrero 2012, 08:09  

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Dudas: Tratamiento de errores en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Dudas: Tratamiento de errores en C  (Leído 1,712 veces)
FaiF (A¥åHøRå)


Desconectado Desconectado

Mensajes: 343



Ver Perfil WWW
Dudas: Tratamiento de errores en C
« en: 23 Octubre 2009, 18:53 »

Hola!

Estoy intentando crear unas funciones para poder añadir a mis programas en ANSI-C que se encarguen del manejo de errores.

De momento, he conseguido que cada vez que una función no finalice correctamente (por un overflow, porque los parámetros estén fuera del rango, etc...) se muestre el código del error mostrando "errno" o la descripción del error con "ferror()".

El problema es que para ver si errno es distinto de 0 (y por lo tanto ha ocurrido un error) tengo que estar evaluando el contenido de errno después de cada función que ejecuto...y esto me parece que es demasiado "chapucero"... ¿No hay alguna forma de que el código quedase tal que así?:

Código:
mientras errno==0 ejecuta:
    funcion1()
    funcion2()
    etc ....
si derrepente errno!=0 ejecuta:
    mostar mensaje
    continuar ejecucción donde se produjo el error

Otra duda que me ha surgido a raíz de esto es: cómo puedo mostrar un mensaje de error si al pedir por scanf un integer (por ejemplo), el usuario introduce una letra.
A mi solo se me ocurre recurrir a capturarlo como un char y luego mirar si es realmente un número... pero también me parece una solución un poco asá...¿Hay otra manera de hacerlo?

Espero que al menos haya podido expresar de manera comprensible mis dudas xD.
Salu2!  ;)


« Última modificación: 23 Octubre 2009, 18:55 por FaiF (A¥åHøRå) » En línea
Festor
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.961


Ver Perfil
Re: Dudas: Tratamiento de errores en C
« Respuesta #1 en: 23 Octubre 2009, 19:17 »

El problema es que para ver si errno es distinto de 0 (y por lo tanto ha ocurrido un error) tengo que estar evaluando el contenido de errno después de cada función que ejecuto...y esto me parece que es demasiado "chapucero"... ¿No hay alguna forma de que el código quedase tal que así?:

Código:
mientras errno==0 ejecuta:
    funcion1()
    funcion2()
    etc ....
si derrepente errno!=0 ejecuta:
    mostar mensaje
    continuar ejecucción donde se produjo el error

Según lo poco que sé de la materia, el problema que veo en lo que pides es que del modo que propones nunca sabrás en que función se produjo el error.

Me refiero a que si error es != 0 puedes mostrar un mensaje pero no hay nada que le diga al sistema que función ha sido la que ha tenido el error. A menos claro que si después de salir el bucle compruebes una por una en busca de la que ha fallado, lo cual es una pérdida de tiempo digo yo...

Además, si se produjo un error en una función ¿para que quieres continuar la ejecución donde se produjo?  :huh:


« Última modificación: 23 Octubre 2009, 19:32 por Festor » En línea
FaiF (A¥åHøRå)


Desconectado Desconectado

Mensajes: 343



Ver Perfil WWW
Re: Dudas: Tratamiento de errores en C
« Respuesta #2 en: 23 Octubre 2009, 21:12 »

Cierto! No me di cuenta de eso, de  que de este modo no sabría que función es la que falla... pero bueno...no me importa mucho de momento porque va a ser programas pequeños en donde lo voy a implementar y voy a saber de antemano lo 2 o 3 errores posibles que van a poder salir....

Y lo de continuar la ejecucción pese el error...es solo por curiosidad, para que se muestren los resultados anómalos, pero vamos, que es lo de menos.

Lo de evitar que introduzcan a través de scanf otros valores que no sean del tipo que yo indique (int, float,...) nadie sabe?

Gracias y saludos!
En línea
aguml

Desconectado Desconectado

Mensajes: 297



Ver Perfil
Re: Dudas: Tratamiento de errores en C
« Respuesta #3 en: 23 Octubre 2009, 21:51 »

¿por que no usas try para controlar los errores? No estoy seguro si eso es Ansi C o es de C++ pero si es de C es lo ideal creo.
En línea
Festor
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.961


Ver Perfil
Re: Dudas: Tratamiento de errores en C
« Respuesta #4 en: 23 Octubre 2009, 22:08 »

¿por que no usas try para controlar los errores? No estoy seguro si eso es Ansi C o es de C++ pero si es de C es lo ideal creo.

http://www.computing.net/answers/programming/try-catch-in-ansi-c/7358.html

Y al menos yo no la encuentro aquí: http://www.conclase.net/c/librerias/funciones.php
« Última modificación: 23 Octubre 2009, 22:15 por Festor » En línea
FaiF (A¥åHøRå)


Desconectado Desconectado

Mensajes: 343



Ver Perfil WWW
Re: Dudas: Tratamiento de errores en C
« Respuesta #5 en: 23 Octubre 2009, 22:25 »

Usaría try/catch como hacía en C++...pero por desgracia no está disponible en ANSI C...
En línea
aguml

Desconectado Desconectado

Mensajes: 297



Ver Perfil
Re: Dudas: Tratamiento de errores en C
« Respuesta #6 en: 23 Octubre 2009, 22:58 »

me respondo yo tambien:

Código:
The following keywords are added with C++ (many for the object-
  oriented features) so it is wise to avoid using them in ANSI C,
  as, for example, variable names:

asm class delete new private public throw
try catch friend inline operator protected
this template virtual

bool explicit namespace true using
const_cast false reinterpret_cast typeid
wchar_t dynamic_cast static_cast typename

 :P
En línea
FaiF (A¥åHøRå)


Desconectado Desconectado

Mensajes: 343



Ver Perfil WWW
Re: Dudas: Tratamiento de errores en C
« Respuesta #7 en: 23 Octubre 2009, 23:32 »

Me respondo definitivamente a mi primera pregunta con Wikilibros xD:

Citar
C does not provide direct support for error handling (also known as exception handling).By convention, the programmer is expected to prevent errors from occurring in the first place, and test return values from functions.
Citar
There is an external variable called "errno", accessible by the programs after including <errno.h> - that file comes from the definition of the possible errors that can occur in some Operating Systems (e.g. Linux - in this case, the definition is in include/asm-generic/errno.h) when programs ask for resources. Such variable indexes error descriptions, that is accessible by the function 'strerror( errno )'.

Y lo que comentaba de que el programa "saltase" a otro lado cuando errno fuese !=0:
Citar
The setjmp function can be used to emulate the exception handling feature of other programming langues. However, using this for exception handling is against common programming conventions.

http://en.wikibooks.org/wiki/C_Programming/Error_handling
 ---------------------

Aún así, sobre la segunda pregunta no encontré una respuesta que me convenza...

Código
#include <stdio.h>
int main()
{
 int entero=0;
 scanf("%d", &entero);
 return 0;
}

Si tengo este código y meten una letra en vez de un número...¿Cómo podría evaluarlo añadiendo solo código?

Saludos y gracias a todos los que habéis intentado ayudar  ;)
En línea
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.707


Nie Dam Sie


Ver Perfil WWW
Re: Dudas: Tratamiento de errores en C
« Respuesta #8 en: 23 Octubre 2009, 23:59 »

Código
  char dato;
 scanf("%c", &dato);
 
 if(isdigit(dato))//ctype.h
 {
 printf("\nEs un numero");
 }
else{
    printf("\nNo es un numero");
    }
 

Si no necesitas operar esos datos ingresados, es mucho mas facil utilizar char. En otro caso, podes convertirlos nuevamente en enteros para operarlos.
« Última modificación: 24 Octubre 2009, 00:00 por Littlehorse » En línea


@NeedOfSecurity

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
Festor
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.961


Ver Perfil
Re: Dudas: Tratamiento de errores en C
« Respuesta #9 en: 24 Octubre 2009, 00:04 »

Gracias Littlehorse, eso me va a venir muy bien a mi. :D
En línea
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.707


Nie Dam Sie


Ver Perfil WWW
Re: Dudas: Tratamiento de errores en C
« Respuesta #10 en: 24 Octubre 2009, 00:08 »

Gracias Littlehorse, eso me va a venir muy bien a mi. :D

De nada  :D.

Obviamente eso es un ejemplo y despues cada uno se las tendra que ingeniar de acuerdo al caso pero, me parece la forma mas simple, mas no se si la mas eficiente. Esperare a ver que dice Eternal Idol que capaz tira alguna data copada.

Un abrazo
En línea


@NeedOfSecurity

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
FaiF (A¥åHøRå)


Desconectado Desconectado

Mensajes: 343



Ver Perfil WWW
Re: Dudas: Tratamiento de errores en C
« Respuesta #11 en: 24 Octubre 2009, 00:16 »

He seguido buscando y podemos comprobar si recoge el dato correctamente sin cambiar el código mucho, haciendo uso del valor que devuelve scanf.

scanf devuelve el número de elementos que convierte y almacena satisfactoriamente, de modo que si en el caso anteriormente descrito se introdujese una letra u otra cosa distinta a un entero... devolvería un 0.

Ejemplo:
Código
#include <stdio.h>
 
int main ()
{
  int capturado;
  int devuelto;
  devuelto=scanf("%d",&capturado);
  printf("Enteros capturados correctamente: %d. Contenido capturado: %d.\n",devuelto,capturado);
  return 0;
}

Saludos!
En línea
Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 4.240


Clarin miente, TN opera y los giles regurgitan.


Ver Perfil WWW
Re: Dudas: Tratamiento de errores en C
« Respuesta #12 en: 24 Octubre 2009, 08:32 »

Como siempre fgets + sscanf  ;D
En línea



La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Warnings en tratamiento de ficheros con C++ Builder XE
Programación C/C++
mario_tko 1 501 Último mensaje 15 Noviembre 2011, 16:01
por do-while
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines