1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
#include <cstdio>
#include <exception>
void println(const char* s) {
puts(s);
fflush(stdout);
}
struct outer_exception {};
struct inner_exception {};
extern "C" {
void throw_cxx_exception() {
if (std::uncaught_exception()) {
println("throwing inner C++ exception");
throw inner_exception();
} else {
println("throwing outer C++ exception");
throw outer_exception();
}
}
void cxx_catch_callback(void (*cb)()) {
try {
cb();
println("unreachable: callback returns");
} catch (outer_exception) {
println("unreachable: caught outer exception in catch (...)");
} catch (inner_exception) {
println("unreachable: caught inner exception in catch (...)");
}
}
}
|