visual try nodejs ejemplo catch c++ exception-handling try-catch

c++ - nodejs - try catch vba



ex.what() cambios en try-catch anidado (3)

Tengo un código anidado try-catch como abajo:

void A() { try { //Code like A = string(NULL) that throws an exception } catch(std::exception& ex) { cout<<"in A : " << ex.what(); throw ex; } } void B() { try { A(); } catch(std::exception& ex) { cout<<"in B : " << ex.what(); } }

Después de ejecutar esto obtuve este resultado:

in A: basic_string::_M_construct null not valid in B: std::exception

Como puede ver, ex.what() funciona bien en la función A y dime la descripción correcta, pero en B ex.what() me dice simplemente std::exception . ¿Por qué pasó esto?

¿Estoy lanzando algo diferente o incorrecto en la cláusula catch de la función A? ¿Cómo puedo lanzar una excepción anidada para obtener la descripción exacta de la excepción en B?


Estás rebanando el objeto de excepción original, prueba con

try { throw std::runtime_error("Hello world"); } catch (std::exception& ex) { cout << "in A : " << ex.what(); throw; // Rethrows the original exception - no copy or slicing ^^^^^^ }


Estás lanzando una copia de la excepción ex en A Lo que causa el corte de objetos que convierte la excepción concreta en std::exception .

Para volver a lanzar la excepción real que capturó de forma polimórfica, use el throw; declaración.

Vale la pena tener en cuenta lo que Scott Meyers dice en su libro. Tiras por valor, y deberías atrapar por referencia.


Reemplace el throw ex; con throw; .

Al hacer esto último, se volverá a lanzar la excepción ex , por referencia , evitando así los peligros al intentar hacer una copia de valor: vea ¿Qué es el corte de objetos?

(Tenga en cuenta que tiene permiso para modificar ex incluso si escribe throw ).