diff options
-rw-r--r-- | lib/system.nim | 14 | ||||
-rw-r--r-- | tests/exception/tunhandledexc.nim | 1 |
2 files changed, 15 insertions, 0 deletions
diff --git a/lib/system.nim b/lib/system.nim index 2b2ce7008..2f95b45f0 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -4117,3 +4117,17 @@ template doAssertRaises*(exception, code: untyped): typed = raiseAssert(astToStr(exception) & " wasn't raised, another error was raised instead by:\n"& astToStr(code)) + +when defined(cpp) and appType != "lib" and not defined(js) and + not defined(nimscript) and hostOS != "standalone": + proc setTerminate(handler: proc() {.noconv.}) + {.importc: "std::set_terminate", header: "<exception>".} + setTerminate proc() {.noconv.} = + # Remove ourself as a handler, reinstalling the default handler. + setTerminate(nil) + + let ex = getCurrentException() + let trace = ex.getStackTrace() + stderr.write trace & "Error: unhandled exception: " & ex.msg & + " [" & $ex.name & "]\n" + quit 1 diff --git a/tests/exception/tunhandledexc.nim b/tests/exception/tunhandledexc.nim index c318aec81..b519fa3f6 100644 --- a/tests/exception/tunhandledexc.nim +++ b/tests/exception/tunhandledexc.nim @@ -2,6 +2,7 @@ discard """ file: "tunhandledexc.nim" outputsub: "Error: unhandled exception: bla [ESomeOtherErr]" exitcode: "1" + targets: "c cpp" """ type ESomething = object of Exception |