jsrosetta

Xử lý lỗi

Stack Trace

console.trace() của Node.js so với debug.Stack() (Go), Backtrace (Rust), callStackSymbols (Swift) và printStackTrace() (Java).

Phiên bản tối thiểu
Node.js ≥ 12.20Go ≥ 1.0Rust ≥ 1.65Swift ≥ 5.1Java ≥ 25
Đã chạy thử trên
Node.js 24.12.0Go 1.27.1Rust 1.98.1Swift 6.2.4Java 25.0.4.1

Code Node.js là ES module: lưu file .mjs hoặc đặt "type": "module" trong package.json.

Khi một lỗi bị bắt, đôi lúc bạn cần in ra cả đường đi của lời gọi hàm dẫn tới nó, không chỉ mỗi message. Node.js có console.trace() sẵn trong global; Go cần gọi runtime/debug.Stack() trong hàm deferred. Rust có std::backtrace::Backtrace, chụp được đầy đủ nếu gọi từ trong panic hook — trước khi unwind bắt đầu. Swift không lưu stack trace cho Error (nó chỉ là một giá trị bình thường); cách gần nhất là tự chụp Thread.callStackSymbols ngay tại nơi ném lỗi rồi đính kèm vào lỗi đó. Java thì khác hẳn: mọi Throwable tự động chụp sẵn stack trace lúc khởi tạo — không cần API riêng nào khác, e.printStackTrace() là đủ.

In stack trace khi bắt lỗi (console.trace vs debug.Stack)

function foo() {
  throw new Error("failed");
}
 
try {
  foo();
} catch (err) {
  console.trace(err);
}
// → Trace: Error: failed
// →     at foo (file:///…/stack-trace.js:2:9)
// →     at file:///…/stack-trace.js:6:3
// →     … (đường dẫn file và số dòng khác nhau tuỳ máy và phiên bản Node.js)

Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#stack-trace