C/Visual C - COMO USO EL MANEJO DE EXCEPCIONES TRY?

 
Vista:

COMO USO EL MANEJO DE EXCEPCIONES TRY?

Publicado por kinomoto (52 intervenciones) el 09/12/2002 17:41:03
el manejo de excepciones mediante TRY-CATCH-END_CATCH funciona igual que el ON ERROR GOTO X de VB?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:COMO USO EL MANEJO DE EXCEPCIONES TRY?

Publicado por El Mogur (202 intervenciones) el 10/12/2002 13:24:21
Aunque tanto el error goto de VB como las excepciones de C++ se utilizan para la gestión de errores, la opción de C++ (que también es la de Java, por ejemplo), es mucho más potente (a no ser que hayan cambiado el significado del 'on error goto X' desde que lo aprendí...)

Como ya dijeron, el manejo de errores en C/C++ debe hacerlo el programador. Cuando no había excepciones (bueno, y ahora que las hay) se utilizaban por ejemplo valores booleanos o especiales indicando el fracaso o no de la operacion. Por ejemplo la función que abre un archivo para lectura: fopen("nombreArchivo"), devuelve NULL si el archivo no se ha podido abrir. El programador debe encargarse de comprobar lo devuelto, para ver si ha habido algún error.
Practicamente todos los errores pueden comprobarse así. Ahora bien, con la idea de las excepciones, lo que se hace es que esa función genere una excepción en caso de error, y en la llamada se captura. Un ejemplo hipotetico seria:
try {
fopen("archivo");
} catch (ExcepcionAperturaFichero ex) {
// Error al abrir el archivo.
}

Eso sería más o menos lo mismo que el ON ERROR GOTO, haciendole que saltes a la sección 'catch'.

Lo malo de esto, en principio, es que si luego existe una operacion de lectura, que también puede generar una excepción, tendrías que poner algo como:

try {
leeByte(c);
} catch (ExcepcionLectura e) {
// Manejo del error de lectura
}

Y así siempbre que llamas a funciones que puedan generar una excepción.

Sin embargo, lo bueno de las excepciones es que al ser el 'ExcepcionAperturaFichero' y 'ExcepcionAperturaFichero' son clases, declaradas de la forma habitual (class NOMBRECLASE {...}), por lo que se puede tener un estructura de clases, unas que heredan de otras.
Siguiendo con el mismo ejemplo, si las dos excepciones anteriores heredan de "ExcepcionEntradaSalida", siempre se puede tener:

try {
fopen("aaa");
fread(c);
} catch (ExcepcionEntradaSalida e) {
// Gestion del error de apertura o lectura.
}

Por lo tanto, con las excepciones se permite un control más fino, a mi parecer, que con el ON ERROR GOTO X. Además, el programador puede crear una estructura de clases para sus excepciones.
Por otra parte, si por ejemplo en el bloque try anterior, se genera otra excepción distinta (por ejemplo división por cero), la excepción se propagaría al bloque catch de otro try más externo. De esta forma, se tiene una gestión de errores personalizado para cada tipo de excepción:

try {
// ....
try {
fopen("aaaa");
fread(c);
} catch (ExcecpionEntradaSalida e) {
// Gestion error de apertura o de lectura.
}
// ....

} catch (DivisionPorCero e) {

cout >> "Division por cero. El programa terminará.\n";
exit(-1);

}

Espero que te sirva todo este sermón!
De todas formas, por tus numerosas preguntas entre VC y VB, me gustaría decir que en realidad estas comparando dos cosas: primero los compiladores, y después los lenguajes. Me refiero con el manejo de errores que preguntas aquí, comparas el lenguaje usado en VB con C++, mientras que en otros casos preguntas sobre las posibilidades de ambos compiladores (cual te permite desarrollo más rápido, etc.)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:COMO USO EL MANEJO DE EXCEPCIONES TRY?

Publicado por El Mogur (202 intervenciones) el 10/12/2002 14:11:47
Aunque tanto el error goto de VB como las excepciones de C++ se utilizan para la gestión de errores, la opción de C++ (que también es la de Java, por ejemplo), es mucho más potente (a no ser que hayan cambiado el significado del 'on error goto X' desde que lo aprendí...)

Como ya dijeron, el manejo de errores en C/C++ debe hacerlo el programador. Cuando no había excepciones (bueno, y ahora que las hay) se utilizaban por ejemplo valores booleanos o especiales indicando el fracaso o no de la operacion. Por ejemplo la función que abre un archivo para lectura: fopen("nombreArchivo"), devuelve NULL si el archivo no se ha podido abrir. El programador debe encargarse de comprobar lo devuelto, para ver si ha habido algún error.
Practicamente todos los errores pueden comprobarse así. Ahora bien, con la idea de las excepciones, lo que se hace es que esa función genere una excepción en caso de error, y en la llamada se captura. Un ejemplo hipotetico seria:
try {
fopen("archivo");
} catch (ExcepcionAperturaFichero ex) {
// Error al abrir el archivo.
}

Eso sería más o menos lo mismo que el ON ERROR GOTO, haciendole que saltes a la sección 'catch'.

Lo malo de esto, en principio, es que si luego existe una operacion de lectura, que también puede generar una excepción, tendrías que poner algo como:

try {
leeByte(c);
} catch (ExcepcionLectura e) {
// Manejo del error de lectura
}

Y así siempbre que llamas a funciones que puedan generar una excepción.

Sin embargo, lo bueno de las excepciones es que al ser el 'ExcepcionAperturaFichero' y 'ExcepcionAperturaFichero' son clases, declaradas de la forma habitual (class NOMBRECLASE {...}), por lo que se puede tener un estructura de clases, unas que heredan de otras.
Siguiendo con el mismo ejemplo, si las dos excepciones anteriores heredan de "ExcepcionEntradaSalida", siempre se puede tener:

try {
fopen("aaa");
fread(c);
} catch (ExcepcionEntradaSalida e) {
// Gestion del error de apertura o lectura.
}

Por lo tanto, con las excepciones se permite un control más fino, a mi parecer, que con el ON ERROR GOTO X. Además, el programador puede crear una estructura de clases para sus excepciones.
Por otra parte, si por ejemplo en el bloque try anterior, se genera otra excepción distinta (por ejemplo división por cero), la excepción se propagaría al bloque catch de otro try más externo. De esta forma, se tiene una gestión de errores personalizado para cada tipo de excepción:

try {
// ....
try {
fopen("aaaa");
fread(c);
} catch (ExcecpionEntradaSalida e) {
// Gestion error de apertura o de lectura.
}
// ....

} catch (DivisionPorCero e) {

cout >> "Division por cero. El programa terminará.\n";
exit(-1);

}

Espero que te sirva todo este sermón!
De todas formas, por tus numerosas preguntas entre VC y VB, me gustaría decir que en realidad estas comparando dos cosas: primero los compiladores, y después los lenguajes. Me refiero con el manejo de errores que preguntas aquí, comparas el lenguaje usado en VB con C++, mientras que en otros casos preguntas sobre las posibilidades de ambos compiladores (cual te permite desarrollo más rápido, etc.)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

CLARO QUE SIRVE 8)

Publicado por kinomoto (52 intervenciones) el 11/12/2002 22:35:25
pues claro que sirve tus "sermones", gracias por la ayuda MOGUR
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar