Node.js에서 스택 추적을 인쇄하는 방법은 무엇입니까?
누구든지 Node.js에서 스택 추적을 인쇄하는 방법을 알고 있습니까?
모든 Error
객체에는 객체가 구성된 stack
지점을 트랩 하는 멤버가 있습니다.
var stack = new Error().stack
console.log( stack )
또는 더 간단하게 :
console.trace("Here I am!")
console.trace()
이미 답변했듯이 간단히 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. Object.Module._extensions..js (module.js : 478 : 10 )
의 Module._compile (module.js : 460 : 26)의 (c : \ Users \ Me \ Documents \ MyApp \ app.js : 17 : 1)
) 시작시 (node.js ) Function.Module.runMain (module.js : 501 : 10)의 Function.Module._load (module.js : 310 : 12)의
Module.load (module.js : 355 : 32) : 129 : 16) node.js : 814 : 3에서
Node.js 버전이 6.0.0보다 작은 경우 Exception 객체를 로깅하는 것으로 충분하지 않습니다. 이 경우 인쇄 만됩니다.
[오류 : 예기치 않은 문제가 발생했습니다.]
노드 버전 <6의 경우 현재 노드 버전과 같이 오류 메시지와 전체 스택을 인쇄하는 console.error(e.stack)
대신 대신 사용 console.error(e)
하십시오.
참고 : 예외가와 같은 문자열로 생성 throw "myException"
되면 스택 추적을 검색 할 수 없으며 로깅 e.stack
은 undefined를 생성 합니다.
안전을 위해 사용할 수 있습니다
console.error(e.stack || e);
이전 및 새로운 Node.js 버전에서 작동합니다.
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)' ]
쉽게 사용할 수있는 노드 모듈을 사용하면 약간의 성능 저하가 발생하더라도 노드에서 전체 길이 스택 추적을 얻을 수 있습니다. http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack -추적 노드 -js
내가 알고있는 nodejs에서 전체 스택 추적을 인쇄하는 것은 불가능합니다. "부분"스택 추적을 인쇄하면됩니다. 코드에서 어디에서 왔는지, 예외가 발생하는 곳에서 볼 수는 없습니다. Ryan Dahl이이 YouTube 비디오에서 설명합니다. 정확성을 위해 최소 56:30의 http://youtu.be/jo_B4LTHi3I 도움이 되었기를 바랍니다
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
.
오류의 스택 추적 만 기록하고 오류 메시지가 아닌 노드 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)
@isaacs 답변은 정확하지만 더 정확한 답변이 있습니다. 이 답변은 노드 js ( 소스 코드 ) 에서 콘솔 클래스의 원래 소스 코드에서 영감을 얻었습니다 .
function getStack() {
var err = new Error();
Error.captureStackTrace(err, getStack);
return err.stack;
}
누군가가 여전히 내가 좋아하는 것을 찾고 있다면 "stack-trace"라는 모듈이 있습니다. 정말 인기가 있습니다. NPM 링크
그런 다음 추적을 걷습니다.
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 모듈을 사용하여 호출 스택을 추적 할 수 있습니다 .
참고 URL : https://stackoverflow.com/questions/2923858/how-to-print-a-stack-trace-in-node-js
'development' 카테고리의 다른 글
TypeError : 'module'개체를 호출 할 수 없습니다 (0) | 2020.02.14 |
---|---|
팩토리와 추상 팩토리 디자인 패턴의 기본 차이점은 무엇입니까? (0) | 2020.02.14 |
Visual Studio“Any CPU”대상은 무엇을 의미합니까? (0) | 2020.02.14 |
"[False, True]의 not (True)"이 False를 반환하는 이유는 무엇입니까? (0) | 2020.02.14 |
ArithmeticException :“비 종료 소수점 확장; (0) | 2020.02.14 |