2012-04-26 18 views
7

deliberadamente Estoy teniendo este método, que escribe en un archivo, por lo que trató de manejar la excepción de la posibilidad de que estoy escribiendo en un archivo cerrado:manejo de excepciones ofstream

void printMe(ofstream& file) 
{ 
     try 
     { 
      file << "\t"+m_Type+"\t"+m_Id";"+"\n"; 
     } 
     catch (std::exception &e) 
     { 
      cout << "exception !! " << endl ; 
     } 
}; 

Pero al parecer, std: : la excepción no es la excepción apropiada para un error de archivo cerrado porque deliberadamente traté de usar este método en un archivo ya cerrado pero mi comentario de "excepción !!" no se generó.

¿Qué excepción debería haber escrito?

Respuesta

12

Las transmisiones no arrojan excepciones de manera predeterminada, pero puede indicarles que generen excepciones con la llamada de función file.exceptions(~goodbit).

En cambio, la forma normal para detectar errores es simplemente para comprobar el estado de la corriente:

if (!file) 
    cout << "error!! " << endl ; 

La razón de esto es que hay muchas situaciones comunes en una lectura no válida es un tema menor, no es una gran uno:

while(std::cin >> input) { 
    std::cout << input << '\n'; 
} //read until there's no more input, or an invalid input is found 
// when the read fails, that's usually not an error, we simply continue 

comparación con:

for(;;) { 
    try { 
     std::cin >> input; 
     std::cout << input << '\n'; 
    } catch(...) { 
     break; 
    } 
} 

Ver online: http://ideone.com/uWgfwj

+0

Bueno, yo solo traté de acostumbrarme al manejo de excepciones, pero es bueno saber que "las transmisiones no arrojan excepciones por defecto", muchas gracias – Glolita

4

excepción del tipo ios_base::failure, Sin embargo, tenga en cuenta que debe haber definido la bandera correspondiente con ios::exceptions para generar las excepciones o indicadores del estado de los demás sólo se va a crearse, para indicar el error, que es el comportamiento por defecto para las corrientes.