面试题答案
一键面试- 捕获错误并记录:
- 在
on('error', callback)
处理函数中,使用console.error
记录错误信息,这样错误可以在控制台中清晰地显示,方便开发者调试。例如:
emitter.on('error', (err) => { console.error('捕获到错误:', err.message); console.error(err.stack); });
- 在
- 优雅地处理错误:
- 尽量避免应用因错误而直接崩溃。对于一些可恢复的错误,可以尝试进行重试操作。例如,假设错误是由于网络请求失败导致的,可以使用一个重试机制。
const retryLimit = 3; let retryCount = 0; emitter.on('error', async (err) => { if (err.code === 'NETWORK_ERROR') { while (retryCount < retryLimit) { try { // 这里假设存在一个网络请求函数networkRequest await networkRequest(); retryCount = 0; break; } catch (newErr) { retryCount++; if (retryCount === retryLimit) { console.error('重试次数用尽,最终错误:', newErr.message); console.error(newErr.stack); } } } } });
- 上报错误:
- 可以使用第三方服务(如 Sentry)将错误上报,这样即使应用在生产环境中运行,开发者也能及时收到错误通知并获取详细的错误信息。
- 首先安装 Sentry 的 Node.js SDK:
npm install @sentry/node
。 - 然后在应用入口处初始化 Sentry:
const Sentry = require('@sentry/node'); Sentry.init({ dsn: 'YOUR_DSN_HERE' });
- 在
on('error', callback)
处理函数中捕获错误并上报:
emitter.on('error', (err) => { Sentry.captureException(err); });
- 提供上下文信息:
- 在错误处理函数中,尽量提供更多的上下文信息。例如,如果错误发生在某个特定的模块或业务逻辑中,可以将相关的参数或状态信息附加到错误对象上。
emitter.on('error', (err) => { const context = { module: '特定模块名称', currentState: '模块当前状态', // 可以根据实际情况添加更多信息 }; err.context = context; console.error('带有上下文的错误:', err); });