Có ai biết cách in dấu vết ngăn xếp trong Node.js không?
Có ai biết cách in dấu vết ngăn xếp trong Node.js không?
Câu trả lời:
Bất kỳ Error
đối tượng nào cũng có một stack
thành viên bẫy điểm mà nó được xây dựng.
var stack = new Error().stack
console.log( stack )
hoặc đơn giản hơn:
console.trace("Here I am!")
'util'
.
new Error().stack
, hoạt động trong trường hợp bạn không muốn liên quan đến bảng điều khiển.
trace
nó là hiển thị dòng / bối cảnh hiện tại cũng stack
không. Thông tin nằm trong đối tượng lỗi nếu bạn muốn tự tạo dòng đó.
Bây giờ có một chức năng chuyên dụng trên bàn điều khiển cho điều đó:
console.trace()
--stack_trace_limit=200
Như đã trả lời, bạn chỉ cần sử dụng lệnh theo dõi :
console.trace("I am here");
Tuy nhiên, nếu bạn đến câu hỏi này để tìm cách ghi nhật ký theo dõi ngăn xếp của một ngoại lệ , bạn chỉ cần đăng nhập đối tượng Ngoại lệ.
try {
// if something unexpected
throw new Error("Something unexpected has occurred.");
} catch (e) {
console.error(e);
}
Nó sẽ đăng nhập:
Lỗi: Một cái gì đó bất ngờ đã xảy ra.
tại chính (c: \ Users \ Me \ Documents \ MyApp \ app.js: 9: 15)
tại Object. (c: \ Users \ Me \ Documents \ MyApp \ app.js: 17: 1)
tại Module._compile (module.js: 460: 26)
tại Object.Module._extensions..js (module.js: 478: 10 )
tại Module.load (module.js: 355: 32)
tại Function.Module._load (module.js: 310: 12)
tại Function.Module.runMain (module.js: 501: 10)
khi khởi động (node.js : 129: 16)
tại node.js: 814: 3
Nếu phiên bản Node.js của bạn là <hơn 6.0.0 , việc ghi nhật ký đối tượng Ngoại lệ sẽ không đủ. Trong trường hợp này, nó sẽ chỉ in:
[Lỗi: Đã xảy ra sự cố không mong muốn.]
Đối với phiên bản Nút <6, sử dụng console.error(e.stack)
thay vì console.error(e)
in thông báo lỗi cộng với ngăn xếp đầy đủ, giống như phiên bản Nút hiện tại.
Lưu ý: nếu ngoại lệ được tạo dưới dạng một chuỗi như thế throw "myException"
, thì không thể truy xuất dấu vết ngăn xếp và ghi e.stack
lại sản lượng không xác định .
Để an toàn, bạn có thể sử dụng
console.error(e.stack || e);
và nó sẽ hoạt động cho các phiên bản Node.js cũ và mới.
console.error(e)
in mọi thứ trong e
đối tượng, bao gồm e.stack
?
Để in stacktrace của Error
trong bảng điều khiển theo cách dễ đọc hơn:
console.log(ex, ex.stack.split("\n"));
Kết quả ví dụ:
[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)' ]
Với một mô-đun Node có sẵn, có thể lấy dấu vết ngăn xếp đầy đủ ra khỏi Node (mặc dù có một hình phạt hiệu suất nhỏ): http://www.mattinsler.com/post/26394305882/announcing-longjohn-long-stack -traces-for-node-js
Hãy thử Error.captureStackTrace (targetObject [, constructorOpt]) .
const myObj = {};
function c() {
// pass
}
function b() {
Error.captureStackTrace(myObj)
c()
}
function a() {
b()
}
a()
console.log(myObj.stack)
Các chức năng a
và b
được nắm bắt trong ngăn xếp lỗi và được lưu trữ trong myObj
.
stack
tính, bạn sẽ cần gọi đây nếu Node> = 6 : Error.captureStackTrace(error)
.
Error.captureStackTrace
hiển thị trong theo dõi ngăn xếp, bạn có thể bỏ qua nó bằng cách chuyển nó dưới dạng đối số constructorOpt
.
Đối với những gì tôi biết, việc in dấu vết ngăn xếp hoàn chỉnh trong nodejs là không thể, bạn chỉ có thể in dấu vết ngăn xếp "một phần", bạn không thể thấy nơi bạn đến từ mã, nơi xảy ra Ngoại lệ. Đó là những gì Ryan Dahl giải thích trong video youtube này. http://youtu.be/jo_B4LTHi3I vào tối thiểu 56:30 vì chính xác. Hi vọng điêu nay co ich
Câu trả lời @isaacs là chính xác, nhưng nếu bạn cần ngăn xếp lỗi cụ thể hơn hoặc rõ ràng hơn , bạn có thể sử dụng chức năng này:
function getCleanerStack() {
var err = new Error();
Error.captureStackTrace(err, getStack);
return err.stack;
}
Hàm này được lấy cảm hứng trực tiếp từ console.trace
hàm trong NodeJS .
Mã nguồn: Phiên bản gần đây hoặc Phiên bản cũ .
err.stack
là câu trả lời đúng hơn.
Nếu bạn muốn chỉ ghi nhật ký theo dõi ngăn xếp của lỗi (chứ không phải thông báo lỗi) Nút 6 trở lên sẽ tự động bao gồm tên lỗi và thông báo bên trong theo dõi ngăn xếp, điều này hơi khó chịu nếu bạn muốn thực hiện một số xử lý lỗi tùy chỉnh:
console.log(error.stack.replace(error.message, ''))
Cách giải quyết này sẽ chỉ ghi lại tên lỗi và theo dõi ngăn xếp (ví dụ, bạn có thể định dạng thông báo lỗi và hiển thị nó theo cách bạn muốn ở một nơi khác trong mã của mình).
Ví dụ trên sẽ chỉ in tên lỗi theo dấu vết ngăn xếp, ví dụ:
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)
Thay vì:
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)
Trong trường hợp ai đó vẫn đang tìm kiếm cái này giống như tôi, thì có một mô-đun chúng ta có thể sử dụng gọi là "stack-vết". Nó thực sự phổ biến. Liên kết NPM
Sau đó đi bộ qua dấu vết.
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.map(function (item){
console.log(new Date().toUTCString() + ' : ' + item.toString() );
});
Hoặc chỉ đơn giản là in dấu vết:
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
bạn có thể sử dụng mô-đun theo dõi nút-stack-stack là mô-đun đầy đủ năng lượng để theo dõi ngăn xếp cuộc gọi.
sys.puts(new Error().stack)
(sau khi thêm mô-đun hệ thống)