错误事件
【Error events】
当 EventEmitter 实例中发生错误时,通常的做法是触发一个 'error' 事件。这些在 Node.js 中被视为特殊情况。
【When an error occurs within an EventEmitter instance, the typical action is
for an 'error' event to be emitted. These are treated as special cases
within Node.js.】
如果一个 EventEmitter 没有为 'error' 事件至少注册一个监听器,而 'error' 事件被触发时,错误会被抛出,打印堆栈跟踪,并且 Node.js 进程会退出。
【If an EventEmitter does not have at least one listener registered for the
'error' event, and an 'error' event is emitted, the error is thrown, a
stack trace is printed, and the Node.js process exits.】
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!'));
// Throws and crashes Node.jsconst EventEmitter = require('node:events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.emit('error', new Error('whoops!'));
// Throws and crashes Node.js为了防止 Node.js 进程崩溃,可以使用 domain 模块。(但请注意,node:domain 模块已被废弃。)
【To guard against crashing the Node.js process the domain module can be
used. (Note, however, that the node:domain module is deprecated.)】
作为最佳实践,应始终为 'error' 事件添加监听器。
【As a best practice, listeners should always be added for the 'error' events.】
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('error', (err) => {
console.error('whoops! there was an error');
});
myEmitter.emit('error', new Error('whoops!'));
// Prints: whoops! there was an errorconst EventEmitter = require('node:events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('error', (err) => {
console.error('whoops! there was an error');
});
myEmitter.emit('error', new Error('whoops!'));
// Prints: whoops! there was an error可以通过使用符号 events.errorMonitor 安装监听器来监视 'error' 事件,而无需处理发出的错误。
【It is possible to monitor 'error' events without consuming the emitted error
by installing a listener using the symbol events.errorMonitor.】
import { EventEmitter, errorMonitor } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on(errorMonitor, (err) => {
MyMonitoringTool.log(err);
});
myEmitter.emit('error', new Error('whoops!'));
// Still throws and crashes Node.jsconst { EventEmitter, errorMonitor } = require('node:events');
const myEmitter = new EventEmitter();
myEmitter.on(errorMonitor, (err) => {
MyMonitoringTool.log(err);
});
myEmitter.emit('error', new Error('whoops!'));
// Still throws and crashes Node.js