Veo que hay muchas respuestas publicadas aquí que caerán en casos afortunados para hacer el trabajo, pero ninguna de ellas es 100% determinista para fallar. Algunos fallarán en un hardware y sistema operativo, los otros no. Sin embargo, hay una forma estándar según el estándar oficial de C ++ para hacer que se bloquee.
Citando del Estándar C ++ ISO / IEC 14882 §15.1-7 :
Si el mecanismo de manejo de excepciones, después de completar la inicialización del objeto de excepción pero antes de la activación de un controlador para la excepción, llama a una función que sale a través de una excepción, se llama std :: terminate (15.5.1).
struct C {
C() { }
C(const C&) {
if (std::uncaught_exceptions()) {
throw 0; // throw during copy to handler’s exception-declaration object (15.3)
}
}
};
int main() {
try {
throw C(); // calls std::terminate() if construction of the handler’s
// exception-declaration object is not elided (12.8)
} catch(C) { }
}
He escrito un pequeño código para demostrar esto y puedo encontrarlo y probarlo en Ideone aquí .
class MyClass{
public:
~MyClass() throw(int) { throw 0;}
};
int main() {
try {
MyClass myobj; // its destructor will cause an exception
// This is another exception along with exception due to destructor of myobj and will cause app to terminate
throw 1; // It could be some function call which can result in exception.
}
catch(...)
{
std::cout<<"Exception catched"<<endl;
}
return 0;
}
ISO / IEC 14882 §15.1 / 9 menciona lanzamiento sin bloqueo de prueba que resulta en una llamada implícita a abortar:
Si actualmente no se maneja ninguna excepción, la ejecución de una expresión de lanzamiento sin operando llama a std :: terminate ()
Otros incluyen: tiro desde el destructor: ISO / IEC 14882 §15.2 / 3
asm { cli; };