关于 Node.js v12.16.2 的错误类型及处理方法
在 Node.js v12.16.2 中,错误通常通过 Error
对象表示,并且可以通过多种方式捕获和处理这些错误。以下是有关错误类型的分类以及常见的处理方法。
错误类型
Node.js 中的错误主要分为两类:同步错误和异步错误。
-
同步错误
同步错误是指发生在主线程上的错误,通常是由于调用某些函数时传入了不合法参数引起的。这类错误可以直接通过try...catch
块捕捉。try { const result = JSON.parse('{ invalid json }'); // 抛出 SyntaxError } catch (err) { console.error(err.message); // 输出错误消息 }
-
异步错误
异步错误通常由事件循环中的回调函数抛出。对于这种错误,无法直接使用try...catch
捕捉,而是需要依赖其他机制,比如.on('error', callback)
或者 Promise 的.catch()
方法。
处理方法
为了更好地管理程序中的错误,Node.js 提供了几种常用的错误处理模式:
-
事件监听器
可以通过绑定'error'
事件来监听并处理错误。如果未处理该事件,则会触发默认行为(即终止进程)。例如,在流操作中可以这样设置:const fs = require('fs'); const readableStream = fs.createReadStream('nonexistentfile.txt'); readableStream.on('error', (err) => { console.error(`File read error: ${ err.message}`); // 自定义错误处理逻辑 });
-
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! } })();
-
Domain 模块(已废弃)
Domain 曾经是一个用来集中管理和统一响应多个资源间可能产生的各种问题的方法集合体,但由于其实现复杂度较高且容易引发难以调试的情况,官方已经将其标记为 deprecated 并推荐改用 clusters 或 worker_threads 等替代方案。 -
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 运行过程中可能会遇到的错误类型及其处理方法。以下是一些常见的错误类型和处理建议:
常见错误类型
-
SyntaxError: 语法错误,通常是由于代码中存在不符合 JavaScript 语法规则的部分引起的。例如,缺少括号、分号等。
// 示例:缺少分号 let a = 5 console.log(a)
-
TypeError: 类型错误,通常是由于对不适当的数据类型进行操作引起的。例如,尝试调用一个非函数类型的变量。
// 示例:尝试调用一个非函数类型的变量 let obj = { }; obj(); // TypeError: obj is not a function
-
ReferenceError: 引用错误,通常是由于访问未定义的变量或对象属性引起的。
// 示例:访问未定义的变量 console.log(nonExistentVariable); // ReferenceError: nonExistentVariable is not defined
-
RangeError: 范围错误,通常是由于数值超出允许的范围引起的。例如,数组长度超过最大值。
// 示例:数组长度超过最大值 let arr = new Array(Number.MAX_SAFE_INTEGER + 1); // RangeError: Invalid array length
-
EvalError: 评估错误,通常与
eval()
函数的使用有关,但现代 JavaScript 中已不再使用eval()
,因此很少见。
错误处理建议
- 调试工具: 使用调试工具如 Chrome DevTools、VSCode Debugger 等来定位和修复错误。
- 日志记录: 使用
console.log()
、console.error()
等方法记录错误信息,帮助追踪问题。 - 异常捕获: 使用
try...catch
语句捕获并处理异常,防止程序崩溃。try { // 可能抛出错误的代码 let result = someFunction(); } catch (error) { console.error('An error occurred:', error); }
- 单元测试: 编写单元测试来验证代码的正确性,提前发现和修复错误。
- 代码审查: 通过代码审查和同行评审来发现潜在的错误和改进点。
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