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
parent 7e643d7378
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,26 +96,32 @@ proc getStackTrace*(): string = rawWriteStackTrace()
proc unhandledException(e: ref Exception) {.
compilerproc, asmNoStackFrame.} =
when NimStackTrace:
var buf = rawWriteStackTrace()
var buf = ""
if e.msg != nil and e.msg[0] != '\0':
add(buf, "Error: unhandled exception: ")
add(buf, e.msg)
else:
var buf = ""
if e.msg != nil and e.msg[0] != '\0':
add(buf, "Error: unhandled exception: ")
add(buf, e.msg)
else:
add(buf, "Error: unhandled exception")
add(buf, " [")
add(buf, e.name)
add(buf, "]\n")
alert(buf)
add(buf, "Error: unhandled exception")
add(buf, " [")
add(buf, e.name)
add(buf, "]\n")
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)
if excHandler == 0:
unhandledException(e)
when defined(nimphp):
asm """throw new Exception($`e`["message"]);"""
else:
@@ -130,15 +131,15 @@ 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):
asm "`isNimException` = isset(`lastJSError`['m_type']);"
else:
asm "`isNimException` = lastJSError.m_type;"
if isNimException:
unhandledException(cast[ref Exception](lastJSError))
if excHandler == 0:
var isNimException: bool
when defined(nimphp):
asm "`isNimException` = isset(`lastJSError`['m_type']);"
else:
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
-----------------