summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/system.nim14
-rw-r--r--tests/exception/tunhandledexc.nim1
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