From de02fd0b898e41fa91087300d82573d83e357b34 Mon Sep 17 00:00:00 2001 From: cooldome Date: Thu, 11 Apr 2019 12:51:51 +0100 Subject: [PATCH] fixes #10765 (#10993) [backport] --- lib/system/excpt.nim | 25 +++++++++++++++++++++---- tests/cpp/tterminate_handler.nim | 9 +++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 tests/cpp/tterminate_handler.nim diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim index ec9d36c554..b421d96504 100644 --- a/lib/system/excpt.nim +++ b/lib/system/excpt.nim @@ -468,19 +468,36 @@ when defined(endb): when defined(cpp) and appType != "lib" and not defined(js) and not defined(nimscript) and hostOS != "standalone" and not defined(noCppExceptions): + + type + StdException {.importcpp: "std::exception", header: "".} = object + + proc what(ex: StdException): cstring {.importcpp: "((char *)#.what())".} + proc setTerminate(handler: proc() {.noconv.}) {.importc: "std::set_terminate", header: "".} + setTerminate proc() {.noconv.} = # Remove ourself as a handler, reinstalling the default handler. setTerminate(nil) + var msg = "Unknown error in unexpected exception handler" + try: + raise + except Exception: + msg = currException.getStackTrace() & "Error: unhandled exception: " & + currException.msg & " [" & $currException.name & "]" + except StdException as e: + msg = "Error: unhandled cpp exception: " & $e.what() + except: + msg = "Error: unhandled unknown cpp exception" + when defined(genode): # stderr not available by default, use the LOG session - echo currException.getStackTrace() & "Error: unhandled exception: " & - currException.msg & " [" & $currException.name & "]\n" + echo msg else: - writeToStdErr currException.getStackTrace() & "Error: unhandled exception: " & - currException.msg & " [" & $currException.name & "]\n" + writeToStdErr msg & "\n" + quit 1 when not defined(noSignalHandler) and not defined(useNimRtl): diff --git a/tests/cpp/tterminate_handler.nim b/tests/cpp/tterminate_handler.nim new file mode 100644 index 0000000000..79949f4dab --- /dev/null +++ b/tests/cpp/tterminate_handler.nim @@ -0,0 +1,9 @@ +discard """ + targets: "cpp" + outputsub: "Error: unhandled unknown cpp exception" + exitcode: 1 +""" +type Crap {.importcpp: "int".} = object + +var c: Crap +raise c \ No newline at end of file