Uncaught exceptions in JS now always propagate with better stack trace.

This commit is contained in:
Yuriy Glukhov 2016-08-27 14:11:41 +03:00
commit 90b0a771e4
2 changed files with 40 additions and 29 deletions

View file

@ -7,11 +7,6 @@
# distribution, for details about the copyright.
#
when defined(nodejs):
proc alert*(s: cstring) {.importc: "console.log", nodecl.}
else:
proc alert*(s: cstring) {.importc, nodecl.}
proc log*(s: cstring) {.importc: "console.log", varargs, nodecl.}
type
@ -101,9 +96,6 @@ proc getStackTrace*(): string = rawWriteStackTrace()
proc unhandledException(e: ref Exception) {.
compilerproc, asmNoStackFrame.} =
when NimStackTrace:
var buf = rawWriteStackTrace()
else:
var buf = ""
if e.msg != nil and e.msg[0] != '\0':
add(buf, "Error: unhandled exception: ")
@ -113,12 +105,21 @@ proc unhandledException(e: ref Exception) {.
add(buf, " [")
add(buf, e.name)
add(buf, "]\n")
alert(buf)
when NimStackTrace:
add(buf, rawWriteStackTrace())
let cbuf : cstring = buf
{.emit: """
if (typeof(Error) !== "undefined") {
throw new Error(`cbuf`);
}
else {
throw `cbuf`;
}
""".}
proc raiseException(e: ref Exception, ename: cstring) {.
compilerproc, asmNoStackFrame.} =
e.name = ename
when not defined(noUnhandledHandler):
if excHandler == 0:
unhandledException(e)
when defined(nimphp):
@ -130,7 +131,6 @@ proc reraiseException() {.compilerproc, asmNoStackFrame.} =
if lastJSError == nil:
raise newException(ReraiseError, "no exception to reraise")
else:
when not defined(noUnhandledHandler):
if excHandler == 0:
var isNimException: bool
when defined(nimphp):
@ -139,6 +139,7 @@ proc reraiseException() {.compilerproc, asmNoStackFrame.} =
asm "`isNimException` = lastJSError.m_type;"
if isNimException:
unhandledException(cast[ref Exception](lastJSError))
asm "throw lastJSError;"
proc raiseOverflow {.exportc: "raiseOverflow", noreturn.} =
@ -873,3 +874,10 @@ proc nimParseBiggestFloat(s: string, number: var BiggestFloat, start = 0): int {
# evaluate sign
number = number * sign
result = i - start
when defined(nodejs):
# Deprecated. Use `alert` defined in dom.nim
proc alert*(s: cstring) {.importc: "console.log", nodecl, deprecated.}
else:
# Deprecated. Use `alert` defined in dom.nim
proc alert*(s: cstring) {.importc, nodecl, deprecated.}

View file

@ -57,6 +57,9 @@ that have tuple name:
- Now when you compile console application for Windows, console output
encoding is automatically set to UTF-8.
- Unhandled exceptions in JavaScript are now thrown regardless ``noUnhandledHandler``
is defined. But now they do their best to provide a readable stack trace.
Library Additions
-----------------