Я немного новичок в javascript, но я хотел попытаться понять, как работает отслеживание стека в nodejs. Мне было немного лень смотреть исходный код, поэтому я просто обратился к справочному языку https://www.ecma -international.org / ecma-262 / 10.0 / index.html # sec-runtime-semantics-catchclauseevaluation и попытался увидеть, что работает. Итак, вот загадка: в ответе я получаю некоторые странные результаты при ловле и броске.
Когда я запускаю:
try { throw Error('foo'); } catch (e) { throw e; }
, я получаю в качестве вывода:
Error: foo
Но когда я запускаю:
try { throw Error('foo'); } catch (e) { console.log(e); throw e; }
Я получаю в качестве вывода:
Error: foo
at repl:1:13
at ContextifyScript.Script.runInThisContext (vm.js:50:33)
at REPLServer.defaultEval (repl.js:240:29)
at bound (domain.js:301:14)
at REPLServer.runBound [as eval] (domain.js:314:12)
at REPLServer.onLine (repl.js:468:10)
at emitOne (events.js:121:20)
at REPLServer.emit (events.js:211:7)
at REPLServer.Interface._onLine (readline.js:282:10)
at REPLServer.Interface._line (readline.js:631:8)
Error: foo
at repl:1:13
at ContextifyScript.Script.runInThisContext (vm.js:50:33)
at REPLServer.defaultEval (repl.js:240:29)
at bound (domain.js:301:14)
at REPLServer.runBound [as eval] (domain.js:314:12)
at REPLServer.onLine (repl.js:468:10)
at emitOne (events.js:121:20)
at REPLServer.emit (events.js:211:7)
at REPLServer.Interface._onLine (readline.js:282:10)
at REPLServer.Interface._line (readline.js:631:8)
Кажется, что при вызове console.log(e)
объект ошибки отслеживает выполнение стек контекста (надеюсь, я правильно использую этот термин), но если он проходит до repl без context.log(e)
, он знает только о своем сообщении об ошибке.
Я пробовал разные перестановкиэтого, а также вложения в разные лексические контексты (функции и другой блок try-catch), и все они, кажется, дают это «забавное» поведение. Кроме того, при выполнении этих сценариев я всегда получаю ожидаемое сообщение об ошибке и трассировку стека, поэтому я склонен полагать, что реализация repl здесь ошибочна. Однако, прежде чем углубляться в источник, я хотел бы проверить некоторых экспертов, чтобы выяснить, есть ли какая-то веская причина для такого поведения, или это просто глупый угловой случай, который я придумал.