2011-05-09 16 views
5

Tengo la siguiente situación.excepciones de archivo de serialización de impulso de captura

Este es un fragmento de código, editado para demostrar el problema.

ifstream ifs("empty_file"); 
if(!ifs.is_open()) { 
    ui.display("Error: Unable to open file \"empty_file\"\n"); 
    return; 
} 

archive::text_iarchive ia(ifs); 
try { 
    ia >> some_class; 
} catch (...) { 
    ui.display("This should catch ever single exception\n"); 
} 

empty_file es, de hecho, un archivo completamente vacío. Esto debería causar un error; y lo hace El problema es que no puedo capturar la excepción lanzada por impulso y abusar del usuario sobre darme un archivo vacío/dañado para cargar.

En su lugar, me sale el siguiente:

Loading... 
terminate called after throwing an instance of 'boost::archive::archive_exception' 
    what(): invalid signature 
Aborted 

Por lo que yo sé, la captura (...) debe capturar cada excepción en existencia. ¿Estoy haciendo algo mal, o la serialización boost :: simplemente atrapa su propia excepción y aborta antes de que tenga la oportunidad de hacer algo?

Si este último es el caso, entonces ¿soy yo o es realmente un mal diseño? Su programa completo no debería fallar (abortar) simplemente desde un archivo de carga dañado. ¿Y qué puedo hacer al respecto?

Respuesta

7

Quizás la excepción la arroje el constructor. Trate de construir el objeto text_iarchive dentro del try, así:

try { 
    archive::text_iarchive ia(ifs); 
    ia >> some_class; 
} catch (...) { 
    ui.display("This should catch every single exception\n"); 
} 

Suponiendo que detecta la excepción, usted querrá tomar el lugar de boost::archive::archive_exception..., por supuesto.

+0

Ejem. Solo fingiré que no soy tan estúpido ... * silbidos despreocupadamente *. Además, lo siento; pero no puedo marcar su respuesta como aceptada por otros tres minutos. EDITAR: Y sí, esa es la primera afirmación de catch que tengo, pero, como dije en la pregunta, el código fue macheteado para no ser inflado pero aún demostrar mi problema (idiotez). – Infiltrator

+3

@Tim: Y solo pretenderé que nunca he cometido errores similares. v) –

0

Intenta marcar las opciones de enlace.

Tengo un problema similar, catch(...) falló en una excepción en write_ini() de boost::property_tree. Lo arreglé quitando -static-libgcc, o usándolo con -static-libstdc++ juntos.

Cuestiones relacionadas