usa try tipos son que programacion manejan las instrucciones hacer funciona excepciones error como catch c++ exception

c++ - try - tipos de excepciones en c#



Creando excepciones personalizadas en C++ (3)

Estoy aprendiendo C ++ y estoy experimentando cuando intento crear mi propia excepción y lanzarlos a Linux.

He creado un pequeño proyecto de prueba para probar mi implementación y a continuación se encuentra mi archivo de encabezado de clase de excepción.

class TestClass : public std::runtime_error { public: TestClass(char const* const message) throw(); virtual char const* what() const throw(); };

El archivo fuente para la clase de excepción es

using namespace std; TestClass::TestClass(char const* const message) throw() : std::runtime_error(message) { } char const * TestClass::what() const throw() { return exception::what(); }

En mi aplicación principal, estoy llamando a una función que lanza mi excepción y la atrapa en un try / catch de la siguiente manera:

void runAFunctionAndthrow(); /* * */ int main(int argc, char** argv) { try { cout << "About to call function" << endl; runAFunctionAndthrow(); } catch (TestClass ex) { cout << "Exception Caught: " << ex.what() << endl; } return 0; } void runAFunctionAndthrow() { cout << "going to run now. oh dear I need to throw an exception" << endl; stringstream logstream; logstream << "This is my exception error. :("; throw TestClass(logstream.str().c_str()); }

Cuando corro estoy esperando obtener el siguiente resultado:

A punto de llamar a la función

Voy a correr ahora. oh cielos necesito lanzar una excepción

Excepción captada: este es mi error de excepción. :(

En cambio, lo que estoy obteniendo es

A punto de llamar a la función

voy a correr ahora. oh cielos necesito lanzar una excepción

Excepción atrapada: estándar :: excepción

Observe la última línea que dice std :: exception en lugar de mi mensaje de excepción real "Este es mi error de excepción".

¿Por qué esto funciona bien en Windows pero en Linux lo hace?

Por lo que he visto en varias publicaciones, lo que he hecho es correcto, entonces, ¿qué me falta?


Necesita su propia implementación del método what () o use std::runtime_error::what() como está escrito en los comentarios

Decir:

class TestClass : public std::runtime_error { std::string what_message; public: const char* what() override { return what_message.c_str(); } };

Además, use mejor noexcept lugar de throw() y solo después de leer sobre ellos: link .

Y en tu try-catch:

catch (const TestClass& myException)

En lugar de catch(TestClass myException) , de lo contrario, realiza una copia implícita que puede dar lugar a un lanzamiento de excepción. También rompe el polimorfismo: si desea catch pure virtual interface instancia de implementación de pure virtual interface , deberá usar una referencia.


Necesita una forma de especificar un mensaje de error personalizado para std :: excepción que afaik no está permitido. Vea this para una posible solución.


Tu what() devuelve:

return exception::what();

El valor de retorno de std::exception::what() se especifica de la siguiente manera :

Puntero a una cadena terminada en nulo con información explicativa.

Eso es. Nada más, nada más. El texto que está mostrando ciertamente califica como una "información explicativa". Y este es el único requisito para el valor de retorno de what() (excepto por otro que no está relacionado aquí).

En otras palabras, C ++ no garantiza el contenido exacto de lo que obtienes con what() . what() ves es what() obtienes, como dice el dicho.

Si desea que su excepción se describa a sí misma, de alguna manera, depende de usted implementar eso, como parte de su what() .