Node.js v12.16.2 的文档中,“Errors“(错误)部分主要介绍了在 Node.js 运行过程中可能会遇到的错误类型及其处理方法

关于 Node.js v12.16.2 的错误类型及处理方法

在 Node.js v12.16.2 中,错误通常通过 Error 对象表示,并且可以通过多种方式捕获和处理这些错误。以下是有关错误类型的分类以及常见的处理方法。

错误类型

Node.js 中的错误主要分为两类:同步错误和异步错误。

  1. 同步错误
    同步错误是指发生在主线程上的错误,通常是由于调用某些函数时传入了不合法参数引起的。这类错误可以直接通过 try...catch 块捕捉。

    try {
         
         
        const result = JSON.parse('{ invalid json }'); // 抛出 SyntaxError
    } catch (err) {
         
         
        console.error(err.message); // 输出错误消息
    }
    
  2. 异步错误
    异步错误通常由事件循环中的回调函数抛出。对于这种错误,无法直接使用 try...catch 捕捉,而是需要依赖其他机制,比如 .on('error', callback) 或者 Promise 的 .catch() 方法。

处理方法

为了更好地管理程序中的错误,Node.js 提供了几种常用的错误处理模式:

  1. 事件监听器
    可以通过绑定 'error' 事件来监听并处理错误。如果未处理该事件,则会触发默认行为(即终止进程)。例如,在流操作中可以这样设置:

    const fs = require('fs');
    const readableStream = fs.createReadStream('nonexistentfile.txt');
    
    readableStream.on('error', (err) => {
         
         
        console.error(`File read error: ${
           
           err.message}`); // 自定义错误处理逻辑
    });
    
  2. Promise 和 Async/Await
    使用基于 Promise 的 API 能够更方便地控制异常传播路径。当发生拒绝状态时,可通过 .catch() 来获取被拒原因;或者利用 async/await 结构化语法简化代码结构。

    function delay(ms) {
         
         
        return new Promise((resolve, reject) => {
         
         
            setTimeout(() => resolve('done'), ms);
        }).then(value => {
         
          throw new Error('Something went wrong!') }); // 故意制造失败情况
    }
    
    (async () => {
         
         
        try {
         
         
            await delay(1000);
        } catch (e) {
         
         
            console.log(e.message); // Something went wrong!
        }
    })();
    
  3. Domain 模块(已废弃)
    Domain 曾经是一个用来集中管理和统一响应多个资源间可能产生的各种问题的方法集合体,但由于其实现复杂度较高且容易引发难以调试的情况,官方已经将其标记为 deprecated 并推荐改用 clusters 或 worker_threads 等替代方案。

  4. Uncaught Exception 和 Unhandled Rejection
    当没有任何地方捕获到某个特定的错误实例时,默认情况下整个应用程序将会崩溃退出。为了避免这种情况的发生,开发者可以选择注册全局级别的处理器来进行兜底保护措施。

    process.on('uncaughtException', err => {
         
         
        console.error('There was an uncaught error:', err.stack);
        process.exit(1); // 推荐显式结束应用以防数据损坏等问题
    });
    
    process.on('unhandledRejection', reason => {
         
         
        console.warn('Unhandled rejection at promise:', reason);
    });
    
总结

上述介绍了几种常见场景下的错误类别划分依据及其对应的解决方案思路。合理运用它们可以帮助构建更加健壮可靠的系统架构设计。

Node.js v12.16.2 的文档中,“Errors”(错误)部分主要介绍了在 Node.js 运行过程中可能会遇到的错误类型及其处理方法。以下是一些常见的错误类型和处理建议:

常见错误类型

  1. SyntaxError: 语法错误,通常是由于代码中存在不符合 JavaScript 语法规则的部分引起的。例如,缺少括号、分号等。

    // 示例:缺少分号
    let a = 5
    console.log(a)
    
  2. TypeError: 类型错误,通常是由于对不适当的数据类型进行操作引起的。例如,尝试调用一个非函数类型的变量。

    // 示例:尝试调用一个非函数类型的变量
    let obj = {
         
         };
    obj(); // TypeError: obj is not a function
    
  3. ReferenceError: 引用错误,通常是由于访问未定义的变量或对象属性引起的。

    // 示例:访问未定义的变量
    console.log(nonExistentVariable); // ReferenceError: nonExistentVariable is not defined
    
  4. RangeError: 范围错误,通常是由于数值超出允许的范围引起的。例如,数组长度超过最大值。

    // 示例:数组长度超过最大值
    let arr = new Array(Number.MAX_SAFE_INTEGER + 1); // RangeError: Invalid array length
    
  5. EvalError: 评估错误,通常与 eval() 函数的使用有关,但现代 JavaScript 中已不再使用 eval(),因此很少见。

错误处理建议

  1. 调试工具: 使用调试工具如 Chrome DevTools、VSCode Debugger 等来定位和修复错误。
  2. 日志记录: 使用 console.log()console.error() 等方法记录错误信息,帮助追踪问题。
  3. 异常捕获: 使用 try...catch 语句捕获并处理异常,防止程序崩溃。
    try {
         
         
        // 可能抛出错误的代码
        let result = someFunction();
    } catch (error) {
         
         
        console.error('An error occurred:', error);
    }
    
  4. 单元测试: 编写单元测试来验证代码的正确性,提前发现和修复错误。
  5. 代码审查: 通过代码审查和同行评审来发现潜在的错误和改进点。

Index View on single page View as JSON View another version ▼ 

Edit on GitHub 

Table of Contents

Errors

    Error Propagation and Interception
        Error-first callbacks

    Class: Error
        new Error(message)
        Error.captureStackTrace(targetObject[, constructorOpt])
        Error.stackTraceLimit
        error.code
        error.message
        error.stack
    Class: AssertionError
    Class: RangeError
    Class: ReferenceError
    Class: SyntaxError

    Class: SystemError
        error.address
        error.code
        error.dest
        error.errno
        error.info
        error.message
        error.path
        error.port
        error.syscall
        Common System Errors
    Class: TypeError
    Exceptions vs. Errors

    OpenSSL Errors
        error.opensslErrorStack
        error.function
        error.library
        error.reason

    Node.js Error Codes
        ERR_AMBIGUOUS_ARGUMENT
        ERR_ARG_NOT_ITERABLE
        ERR_ASSERTION
        ERR_ASYNC_CALLBACK
        ERR_ASYNC_TYPE
        ERR_BROTLI_COMPRESSION_FAILED
        ERR_BROTLI_INVALID_PARAM
        ERR_BUFFER_CONTEXT_NOT_AVAILABLE
        ERR_BUFFER_OUT_OF_BOUNDS
        ERR_BUFFER_TOO_LARGE
        ERR_CANNOT_WATCH_SIGINT
        ERR_CHILD_CLOSED_BEFORE_REPLY
        ERR_CHILD_PROCESS_IPC_REQUIRED
        ERR_CHILD_PROCESS_STDIO_MAXBUFFER
        ERR_CONSOLE_WRITABLE_STREAM
        ERR_CONSTRUCT_CALL_REQUIRED
        ERR_CONSTRUCT_CALL_INVALID
        ERR_CPU_USAGE
        ERR_CRYPTO_CUSTOM_ENGINE_NOT_SUPPORTED
        ERR_CRYPTO_ECDH_INVALID_FORMAT
        ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY
        ERR_CRYPTO_ENGINE_UNKNOWN
        ERR_CRYPTO_FIPS_FORCED
        ERR_CRYPTO_FIPS_UNAVAILABLE
        ERR_CRYPTO_HASH_FINALIZED
        ERR_CRYPTO_HASH_UPDATE_FAILED
        ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS
        ERR_CRYPTO_INVALID_DIGEST
        ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE
        ERR_CRYPTO_INVALID_STATE
        ERR_CRYPTO_PBKDF2_ERROR
        ERR_CRYPTO_SCRYPT_INVALID_PARAMETER
        ERR_CRYPTO_SCRYPT_NOT_SUPPORTED
        ERR_CRYPTO_SIGN_KEY_REQUIRED
        ERR_CRYPTO_TIMING_SAFE_EQUAL_LENGTH
        ERR_DIR_CLOSED
        ERR_DNS_SET_SERVERS_FAILED
        ERR_DOMAIN_CALLBACK_NOT_AVAILABLE
        ERR_DOMAIN_CANNOT_SET_UNCAUGHT_EXCEPTION_CAPTURE
        ERR_ENCODING_INVALID_ENCODED_DATA
        ERR_ENCODING_NOT_SUPPORTED
        ERR_FALSY_VALUE_REJECTION
        ERR_FS_FILE_TOO_LARGE
        ERR_FS_INVALID_SYMLINK_TYPE
        ERR_HTTP_HEADERS_SENT
        ERR_HTTP_INVALID_HEADER_VALUE
        ERR_HTTP_INVALID_STATUS_CODE
        ERR_HTTP_TRAILER_INVALID
        ERR_HTTP2_ALTSVC_INVALID_ORIGIN
        ERR_HTTP2_ALTSVC_LENGTH
        ERR_HTTP2_CONNECT_AUTHORITY
        ERR_HTTP2_CONNECT_PATH
        ERR_HTTP2_CONNECT_SCHEME
        ERR_HTTP2_ERROR
        ERR_HTTP2_GOAWAY_SESSION
        ERR_HTTP2_HEADERS_AFTER_RESPOND
        ERR_HTTP2_HEADERS_SENT
        ERR_HTTP2_HEADER_SINGLE_VALUE
        ERR_HTTP2_INFO_STATUS_NOT_ALLOWED
        ERR_HTTP2_INVALID_CONNECTION_HEADERS
        ERR_HTTP2_INVALID_HEADER_VALUE
        ERR_HTTP2_INVALID_INFO_STATUS
        ERR_HTTP2_INVALID_ORIGIN
        ERR_HTTP2_INVALID_PACKED_SETTINGS_LENGTH
        ERR_HTTP2_INVALID_PSEUDOHEADER
        ERR_HTTP2_INVALID_SESSION
        ERR_HTTP2_INVALID_SETTING_VALUE
        ERR_HTTP2_INVALID_STREAM
        ERR_HTTP2_MAX_PENDING_SETTINGS_ACK
        ERR_HTTP2_NESTED_PUSH
        ERR_HTTP2_NO_SOCKET_MANIPULATION
        ERR_HTTP2_ORIGIN_LENGTH
        ERR_HTTP2_OUT_OF_STREAMS
        ERR_HTTP2_PAYLOAD_FORBIDDEN
        ERR_HTTP2_PING_CANCEL
        ERR_HTTP2_PING_LENGTH
        ERR_HTTP2_PSEUDOHEADER_NOT_ALLOWED
        ERR_HTTP2_PUSH_DISABLED
        ERR_HTTP2_SEND_FILE
        ERR_HTTP2_SEND_FILE_NOSEEK
        ERR_HTTP2_SESSION_ERROR
        ERR_HTTP2_SETTINGS_CANCEL
        ERR_HTTP2_SOCKET_BOUND
        ERR_HTTP2_SOCKET_UNBOUND
        ERR_HTTP2_STATUS_101
        ERR_HTTP2_STATUS_INVALID
        ERR_HTTP2_STREAM_CANCEL
        ERR_HTTP2_STREAM_ERROR
        ERR_HTTP2_STREAM_SELF_DEPENDENCY
        ERR_HTTP2_TRAILERS_ALREADY_SENT
        ERR_HTTP2_TRAILERS_NOT_READY
        ERR_HTTP2_UNSUPPORTED_PROTOCOL
        ERR_INTERNAL_ASSERTION
        ERR_INCOMPATIBLE_OPTION_PAIR
        ERR_INPUT_TYPE_NOT_ALLOWED
        ERR_INSPECTOR_ALREADY_CONNECTED
        ERR_INSPECTOR_CLOSED
        ERR_INSPECTOR_COMMAND
        ERR_INSPECTOR_NOT_ACTIVE
        ERR_INSPECTOR_NOT_AVAILABLE
        ERR_INSPECTOR_NOT_CONNECTED
        ERR_INSPECTOR_NOT_WORKER
        ERR_INVALID_ADDRESS_FAMILY
        ERR_INVALID_ARG_TYPE
        ERR_INVALID_ARG_VALUE
        ERR_INVALID_ASYNC_ID
        ERR_INVALID_BUFFER_SIZE
        ERR_INVALID_CALLBACK
        ERR_INVALID_CHAR
        ERR_INVALID_CURSOR_POS
        ERR_INVALID_FD
        ERR_INVALID_FD_TYPE
        ERR_INVALID_FILE_URL_HOST
        ERR_INVALID_FILE_URL_PATH
        ERR_INVALID_HANDLE_TYPE
        ERR_INVALID_HTTP_TOKEN
        ERR_INVALID_IP_ADDRESS
        ERR_INVALID_MODULE_SPECIFIER
        ERR_INVALID_OPT_VALUE
        ERR_INVALID_OPT_VALUE_ENCODING
        ERR_INVALID_PACKAGE_CONFIG
        ERR_INVALID_PACKAGE_TARGET
        ERR_INVALID_PERFORMANCE_MARK
        ERR_INVALID_PROTOCOL
        ERR_INVALID_REPL_EVAL_CONFIG
        ERR_INVALID_REPL_INPUT
        ERR_INVALID_RETURN_PROPERTY
        ERR_INVALID_RETURN_PROPERTY_VALUE
        ERR_INVALID_RETURN_VALUE
        ERR_INVALID_SYNC_FORK_INPUT
        ERR_INVALID_THIS
        ERR_INVALID_TRANSFER_OBJECT
        ERR_INVALID_TUPLE
        ERR_INVALID_URI
        ERR_INVALID_URL
        ERR_INVALID_URL_SCHEME
        ERR_IPC_CHANNEL_CLOSED
        ERR_IPC_DISCONNECTED
        ERR_IPC_ONE_PIPE
        ERR_IPC_SYNC_FORK
        ERR_MANIFEST_ASSERT_INTEGRITY
        ERR_MANIFEST_DEPENDENCY_MISSING
        ERR_MANIFEST_INTEGRITY_MISMATCH
        ERR_MANIFEST_INVALID_RESOURCE_FIELD
        ERR_MANIFEST_PARSE_POLICY
        ERR_MANIFEST_TDZ
        ERR_MANIFEST_UNKNOWN_ONERROR
        ERR_MEMORY_ALLOCATION_FAILED
        ERR_METHOD_NOT_IMPLEMENTED
        
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值