📜  什么是 stacktrace 以及如何在 node.js 中打印?

📅  最后修改于: 2022-05-13 01:56:49.364000             🧑  作者: Mango

什么是 stacktrace 以及如何在 node.js 中打印?

Node.js 是一个可用于服务器端脚本的开源项目。 Node.js 是一个跨平台的,它允许开发人员编写代码而不必担心运行时环境。 Node.js 广泛用于构建动态、轻量级和可扩展的 Web 应用程序。 Node.js 提供了一个可用于前端和后端开发的 JavaScript 运行时环境。但是,应用程序经常抛出必须处理的错误或异常。

JVM 会自动显示堆栈跟踪,以指示在程序执行期间发生了错误。堆栈跟踪用于在程序执行期间跟踪特定实例处的活动堆栈帧。堆栈跟踪在调试代码时很有用,因为它显示了导致错误的确切点。 Node.js 中的错误可以分为四大类:

  • 标准 JavaScript 错误
  • 系统错误
  • 用户指定的错误
  • 断言错误

Node.js 支持多种机制来传播和处理程序执行期间发生的错误。通过抛出可以在堆栈跟踪中查看的错误来立即处理所有标准 JavaScript 错误。

在 Node.js 中打印堆栈跟踪有四种方法:

  • 使用 error.stack 属性: error.stack 属性描述了代码中错误被实例化的点。

    句法:

    error.stack

    例子:

    console.log("This program demonstrates "
                + "stack trace in Node.js");
    var err = new Error().stack
    console.log(err);
    

    输出:

    This program demonstrates stack trace in Node.js
    Error
        at Object. (/home/cg/root/2523129/main.js:20:11)
        at Module._compile (module.js:570:32)
        at Object.Module._extensions..js (module.js:579:10)
        at Module.load (module.js:487:32)
        at tryModuleLoad (module.js:446:12)
        at Function.Module._load (module.js:438:3)
        at Module.runMain (module.js:604:10)
        at run (bootstrap_node.js:389:7)
        at startup (bootstrap_node.js:149:9)
        at bootstrap_node.js:504:3
    
  • 使用 Error.captureStackTrace() 方法:此方法在 obj 上创建一个 .stack 属性,该属性返回一个字符串,该字符串表示调用 Error.captureStackTrace(obj) 的代码中的点。 func 参数表示一个可选的函数。

    句法:
    Error.captureStackTrace(obj, func)

    例子:

    const obj = {};
    Error.captureStackTrace(obj);
    console.log(obj.stack);
      
    // Alternatively
    function MyNewError() {
        Error.captureStackTrace(this, MyNewError);
    }
      
    console.log(new MyNewError().stack);
    

    输出:

    Error
        at Object. (/home/cg/root/2523129/main.js:25:13)
        at Module._compile (module.js:570:32)
        at Object.Module._extensions..js (module.js:579:10)
        at Module.load (module.js:487:32)
        at tryModuleLoad (module.js:446:12)
        at Function.Module._load (module.js:438:3)
        at Module.runMain (module.js:604:10)
        at run (bootstrap_node.js:389:7)
        at startup (bootstrap_node.js:149:9)
        at bootstrap_node.js:504:3
    
  • 使用 try-catch 块:这是一种错误处理机制,当一段代码被包围在 try 块中并向 catch 块抛出错误时使用。如果错误没有得到处理,那么程序会突然终止。

    例子:

    try {
        throw new Error("Error occurred");  
    }
    catch(e) {
        console.log(e);
    }
    

    输出:

    Error
        at Object. (/home/cg/root/2523129/main.js:25:13)
        at Module._compile (module.js:570:32)
        at Object.Module._extensions..js (module.js:579:10)
        at Module.load (module.js:487:32)
        at tryModuleLoad (module.js:446:12)
        at Function.Module._load (module.js:438:3)
        at Module.runMain (module.js:604:10)
        at run (bootstrap_node.js:389:7)
        at startup (bootstrap_node.js:149:9)
        at bootstrap_node.js:504:3
    
  • 使用跟踪命令: console.trace() 方法用于显示表示代码如何在某个点结束的跟踪。

    例子:

    console.trace("hello world");
    

    输出:

    Trace: hello world
        at Object. (/home/cg/root/2523129/main.js:28:9)
        at Module._compile (module.js:570:32)
        at Object.Module._extensions..js (module.js:579:10)
        at Module.load (module.js:487:32)
        at tryModuleLoad (module.js:446:12)
        at Function.Module._load (module.js:438:3)
        at Module.runMain (module.js:604:10)
        at run (bootstrap_node.js:389:7)
        at startup (bootstrap_node.js:149:9)
        at bootstrap_node.js:504:3