mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-31 18:32:11 +00:00
Uncaught exceptions in JS now always propagate with better stack trace.
This commit is contained in:
@@ -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.}
|
||||
|
||||
@@ -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
|
||||
-----------------
|
||||
|
||||
|
||||
Reference in New Issue
Block a user