Хтось знає, як надрукувати слід стека в Node.js?
Хтось знає, як надрукувати слід стека в Node.js?
Відповіді:
Будь-який Error
об’єкт має stack
член, який захоплює точку, в якій він був побудований.
var stack = new Error().stack
console.log( stack )
або простіше:
console.trace("Here I am!")
'util'
.
new Error().stack
, що працює у випадках, коли ви не хочете залучати консоль.
trace
є те, що він показує поточний рядок / контекст, а також stack
цього не робить. Інформація знаходиться в об’єкті помилки, якщо ви хочете вручну створити цей рядок, я думаю.
Тепер для консолі призначена спеціальна функція :
console.trace()
console.trace()
.
--stack_trace_limit=200
Як уже відповіли, ви можете просто скористатися командою trace :
console.trace("I am here");
Однак якщо ви звернулися до цього питання, шукаючи про те, як записати слід стека виключення , ви можете просто ввідати об'єкт Exception.
try {
// if something unexpected
throw new Error("Something unexpected has occurred.");
} catch (e) {
console.error(e);
}
Він увійде:
Помилка: сталося щось несподіване.
в основному (c: \ Users \ Me \ Documents \ MyApp \ app.js: 9: 15)
в Object. (c: \ Users \ Me \ Documents \ MyApp \ app.js: 17: 1)
в Module._compile (module.js: 460: 26)
в Object.Module._extensions..js (module.js: 478: 10 )
на Module.load (module.js: 355: 32)
у Function.Module._load (module.js: 310: 12)
на Function.Module.runMain (module.js: 501: 10)
при запуску (node.js : 129: 16)
на node.js: 814: 3
Якщо ваша версія Node.js <6.0.0 , реєстрація об'єкта «Виняток» буде недостатньою. У цьому випадку він буде друкувати лише:
[Помилка: сталося щось несподіване.]
Для версії Node <6 використовуйте console.error(e.stack)
замість того, console.error(e)
щоб надрукувати повідомлення про помилку плюс повний стек, як це робить поточна версія вузла.
Примітка: якщо виняток створено у вигляді рядка throw "myException"
, неможливо отримати слід стека та e.stack
доходи журналу не визначені .
Щоб бути безпечним, ви можете використовувати
console.error(e.stack || e);
і він буде працювати для старих і нових версій Node.js.
console.error(e)
вдасться роздрукувати все в e
об’єкті, в тому числі e.stack
?
Щоб друкувати стек-трек Error
консолі більш читаним способом:
console.log(ex, ex.stack.split("\n"));
Приклад результату:
[Error] [ 'Error',
' at repl:1:7',
' at REPLServer.self.eval (repl.js:110:21)',
' at Interface.<anonymous> (repl.js:239:12)',
' at Interface.EventEmitter.emit (events.js:95:17)',
' at Interface._onLine (readline.js:202:10)',
' at Interface._line (readline.js:531:8)',
' at Interface._ttyWrite (readline.js:760:14)',
' at ReadStream.onkeypress (readline.js:99:10)',
' at ReadStream.EventEmitter.emit (events.js:98:17)',
' at emitKey (readline.js:1095:12)' ]
Завдяки доступному модулю Node можна отримати сліди стека в повному розмірі з Node (хоча і з незначним покаранням продуктивності): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack -traces-for-node-js
Спробуйте Error.captureStackTrace (targetObject [, constructorOpt]) .
const myObj = {};
function c() {
// pass
}
function b() {
Error.captureStackTrace(myObj)
c()
}
function a() {
b()
}
a()
console.log(myObj.stack)
Функція a
і b
фіксується в стеці помилок і зберігається в myObj
.
stack
властивість, вам потрібно викликати це , якщо вузол> = 6: Error.captureStackTrace(error)
.
Error.captureStackTrace
відображався у сліді стека, його можна опустити, передавши його як constructorOpt
аргумент.
Оскільки я знаю, друк повного сліду стека в nodejs неможливий, ви можете просто надрукувати "частковий" слід стека, ви не можете бачити, звідки ви прийшли в коді, саме там, де відбувається виняток. Саме це пояснює Райан Дал у цьому відео на YouTube. http://youtu.be/jo_B4LTHi3I о хв. 56:30 за точність. Сподіваюсь, це допомагає
Відповідь @isaacs правильна, але якщо вам потрібен більш конкретний чи чистіший стек помилок , ви можете скористатися цією функцією:
function getCleanerStack() {
var err = new Error();
Error.captureStackTrace(err, getStack);
return err.stack;
}
Ця функція натхненна безпосередньо console.trace
функцією в NodeJS .
Вихідний код: Остання версія або стара версія .
err.stack
правильніша відповідь.
Якщо ви хочете лише зафіксувати трасування стека помилки (а не повідомлення про помилку). Вузол 6 і вище автоматично включає ім’я та повідомлення про помилку всередині сліду стека, що трохи дратує, якщо ви хочете виконати якусь власну обробку помилок:
console.log(error.stack.replace(error.message, ''))
У цьому вирішенні буде записано лише ім'я помилки та трасування стека (так що ви можете, наприклад, відформатувати повідомлення про помилку та відобразити його як потрібно десь у коді).
Наведений вище приклад видав би лише ім'я помилки, за яким слідує стежка стека, наприклад:
Error:
at /Users/cfisher/Git/squashed/execProcess.js:6:17
at ChildProcess.exithandler (child_process.js:213:5)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:877:16)
at Socket.<anonymous> (internal/child_process.js:334:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:498:12)
Замість:
Error: Error: Command failed: sh ./commands/getBranchCommitCount.sh HEAD
git: 'rev-lists' is not a git command. See 'git --help'.
Did you mean this?
rev-list
at /Users/cfisher/Git/squashed/execProcess.js:6:17
at ChildProcess.exithandler (child_process.js:213:5)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:877:16)
at Socket.<anonymous> (internal/child_process.js:334:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:498:12)
Якщо хтось все ще шукає такого, як я, то є модуль, який ми можемо використовувати під назвою "стек-слід". Це дійсно популярно. NPM Link
Потім пройдіться слідом.
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.map(function (item){
console.log(new Date().toUTCString() + ' : ' + item.toString() );
});
Або просто надрукуйте слід:
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
ви можете використовувати node-stack-trace module, який є повноцінним модулем для відстеження стеків викликів.
sys.puts(new Error().stack)
(після додавання системного модуля)