C/Visual C - Es correcto pones un exit en el constructor

 
Vista:

Es correcto pones un exit en el constructor

Publicado por Luis (11 intervenciones) el 21/01/2003 16:00:12
Tengo un constructor al que le paso, entre otros parámetros, el nombre de un fichero. ¿Es correcto abrir el fichero en el constructor y si me da error escribir un mensaje y hacer un exit?. En general, está bien hecho hacer un exit en el constructor de una clase debido a un error que impide seguir la aplicación o eso no se debe hacer en el constructor
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:Es correcto pones un exit en el constructor

Publicado por chuidiang (677 intervenciones) el 22/01/2003 10:24:15
Depende un poco de la clase.

Lo de abrir el fichero en el constructor puede ser correcto (de hecho java lo hace asi).

Lo de hacer un exit es mas discutible.Si la clase que abre el fichero quieres reutillizarla en otros proyectos, a lo mejor en ellos no te interesa que se haga el exit automaticamente. Es más, dentro de un mismo proyecto puedes abrir varios ficheros con la misma clase. Quizas si no encuentras algunos de ellos si debas salir de la aplicacion porque no puedes continuar, pero en otros a lo mejor no es necesario.

Resumiendo, alto tan "gordo" como exit no deberias hacerlo en clases de "bajo nivel" o que sean susceptibles de ser reutilizadas. Sí podrias hacerlos en clases de "alto nivel", que estes casi seguro que no vas a reutilizar nunca más, salvo en ese proyecto.

En cuanto al mensaje de error, puedes aplicar lo mismo. Si la clase va a ser reutilizable, deberia devolver un código de error con el return o lanzar una excepción a algo asi. El código que la utilice deberá recoger el error o la excepción y decidir si lo escribe en pantalla, si saca una ventana de aviso o si simplemente lo ignora.

Si la clase es de "alto nivel" y quieres que tu aplicación escriba errores en pantalla, si puedes hacerlo así.

Se bueno.
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:Es correcto pones un exit en el constructor

Publicado por Luis (11 intervenciones) el 22/01/2003 13:05:29
Lo comento porque como el constructor no puede retornar nada, no se puede devolver ningún codigo de error y si debo abortar la aplicación debería hacer un exit ¿no?. Es como lo de reservar memoria en el constructor ¿Qué ocurre si falla? ¿Debo hacer un exit? no puedo retornar error porque el constructor no retorna nada ¿no?...No sé cómo es la mejor manera de hacerlo.
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:Es correcto pones un exit en el constructor

Publicado por Googol (255 intervenciones) el 22/01/2003 14:00:41
Si el constructor tiene inicialización que puede resultar errónea, hay varias alternativas. Desde luego, la de hacer un exit es una... pero es demasiado drastica y deja de ser práctica muy a menudo. Además impone muchas restricciones, porque el exit te impide terminar de un modo "elegante" tu aplicación. Además lo de mostrar un mensaje de error en el constructor tampoco es muy elegante. Puede servir en tu aplicación actual si es para consola, pero si quieres reutilizar la clase en un futuro en una aplicación de ventana, ¿qué ocurre con el mensaje escrito con cout o con printf? El usuario no lo vería...
Total, hay que buscar alguna otra solución. La primera que se me ocurre es que la clase tenga una variable booleana que indique si ha habido o no error en el constructor, y obligar a los usuarios de la clase a comprobarlo.

class A {
public: A(...) { ... si hay error, huboError = true; }
getHuboError() { return huboError; }
private: bool huboError;
}

void usoDeClaseA()
A varA(...);
if (varA.huboError()) { ... }

Para evitar que a los usuarios de la clase se les "olvide" comprobar la inicialización, puedes forzar a una inicialización en dos pasos, donde el constructor no hace nada, y luego hay una función que es la que inicializa, recibe los parámetros, y devuelve el error. Si se usa el objeto sin haber hecho la inicialización, todo debe acabar con error, o algo así.
Y la última opción que se me ocurre es la que ha dicho chuidiang, usar excepciones. Aunque un constructor no pueda devolver un valor puede generar una excepción (indicando un error).
class Excepcion {
public:
Excepcion(std::string error) : _error(error) {}
std::string getError() { return _error; }
private:
std::string _error;
};

class Clase {
public:
Clase() { [...]; throw new Excepcion("No pude abrir el fichero"); }
};

void ejemploUso() {
try {
Clase c;
Otras cosas
} catch (Excepcion& e) {
// Manejar convenientemente el error, cuya descripción está en e.getError();
}
}

Espero que te sirva!
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