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()
.