add system.onUnhandledException feature

This commit is contained in:
Andreas Rumpf
2017-07-12 15:37:41 +02:00
parent ccbc09fb0b
commit 57ed077c1e

View File

@@ -230,6 +230,18 @@ when false:
pushCurrentException(e)
c_longjmp(excHandler.context, 1)
var onUnhandledException*: (proc (errorMsg: string) {.
nimcall.}) ## set this error \
## handler to override the existing behaviour on an unhandled exception.
## The default is to write a stacktrace to ``stderr`` and then call ``quit(1)``.
## Unstable API.
template unhandled(buf, body) =
if onUnhandledException != nil:
onUnhandledException(buf)
else:
body
proc raiseExceptionAux(e: ref Exception) =
if localRaiseHook != nil:
if not localRaiseHook(e): return
@@ -260,7 +272,9 @@ proc raiseExceptionAux(e: ref Exception) =
add(buf, " [")
add(buf, $e.name)
add(buf, "]\n")
showErrorMessage(buf)
unhandled(buf):
showErrorMessage(buf)
quitOrDebug()
else:
# ugly, but avoids heap allocations :-)
template xadd(buf, s, slen: expr) =
@@ -276,8 +290,9 @@ proc raiseExceptionAux(e: ref Exception) =
add(buf, " [")
xadd(buf, e.name, e.name.len)
add(buf, "]\n")
showErrorMessage(buf)
quitOrDebug()
unhandled(buf):
showErrorMessage(buf)
quitOrDebug()
proc raiseException(e: ref Exception, ename: cstring) {.compilerRtl.} =
if e.name.isNil: e.name = ename