2010-04-26 15 views
9

Estoy usando gcc en Linux para compilar el código C++. Existen algunas excepciones que no se deben manejar y deben cerrar el programa. Sin embargo, me gustaría ser capaz de mostrar cadena excepción:Tiempo de ejecución C++, mostrar el mensaje de excepción

Por ejemplo:

throw std::runtime_error(" message"); no muestra el mensaje, sólo el tipo de error. Me gustaría mostrar mensajes también. ¿Hay forma de hacerlo?

es una biblioteca, realmente no quiero poner declaraciones atrapadas y dejar que el usuario de la biblioteca decida. Sin embargo, en este momento el usuario de la biblioteca es fortran, lo que no permite manejar excepciones. , en principio, puedo poner los manipuladores de código de contenedor, sino más bien de no si hay una manera alrededor de

+0

'throw std :: runtime_error (" message ");' ahora muestra el mensaje en g ++ 6.2.0, Ubuntu 16.10. –

Respuesta

12

excepciones estándar tienen un método virtual what() que le da el mensaje asociado con la excepción:

int main() { 
    try { 
     // your stuff 
    } 
    catch(const std::exception & ex) { 
     cerr << ex.what() << endl; 
    } 
} 
+0

Puse aclaraciones acerca de mis requisitos – Anycorn

+3

@aaa Si su código está destinado a ser utilizado desde código que no sea C++, se le debe dar un enlace C y nunca debe permitir excepciones para escapar al código de llamada. –

+0

¿Cuál es una buena manera de comunicar problemas de terminal en el programa principal? Necesito cierta facilidad para imprimir cadena de errores, sin depender de la salida fortran – Anycorn

6

Se puede escribir en el principal:

try{ 

}catch(const std::exception &e){ 
    std::cerr << e.what() << std::endl; 
    throw; 
} 
+0

Puse algunas aclaraciones. En principio puedo ir con algo como esto si no hay forma de evitarlo – Anycorn

+0

Y tenga en cuenta que esto tiene la desventaja de volar su callstack que g ++ normalmente preservaría en el archivo central para excepciones no detectadas. –

2

se podía utilizar try/catch bloque y throw; declaración para que el usuario de la biblioteca para manejar la excepción. La instrucción throw; pasa el control a otro controlador para la misma excepción.

+0

bien, creo que pondré try catch con mensaje impreso en envoltorios fortran/c y lanzaré desde allí. entonces permitiré que la interfaz C++ maneje las excepciones por sí misma – Anycorn

1

Recomiendo hacer un adaptador para su biblioteca para los que llamen. Pon tu try/catch en el adaptador. Esencialmente, su biblioteca necesita puntos de entrada múltiples si desea que se llame desde fortran (o C), pero aún permita excepciones para propiciar las llamadas a C++. De esta manera también tiene la ventaja de proporcionar enlaces C++ a llamantes en C++. Solo tener una interfaz fortran lo limitará sustancialmente ya que todo debe pasarse por referencia, necesita tener en cuenta los parámetros ocultos para los argumentos de char *

Cuestiones relacionadas