面试题答案
一键面试设计思路
- 错误封装:将错误信息进行封装,包含错误来源线程、错误详情等信息,便于追踪和处理。
- 事件机制:利用Node.js的事件驱动特性,每个线程在发生错误时触发一个自定义事件。
- 中央错误处理器:设立一个中央错误处理模块,监听来自各个线程的错误事件,并根据错误的依赖关系进行处理和传播。
- 依赖关系管理:维护一个线程依赖关系的映射表,用于确定错误应该传播到哪些线程。
- 资源释放:在错误处理完成后,及时释放相关资源,避免资源浪费。
核心代码示例
1. 封装错误类
class ThreadError extends Error {
constructor(message, sourceThread) {
super(message);
this.sourceThread = sourceThread;
this.name = 'ThreadError';
}
}
2. 线程模块示例(简化示意,实际多线程在Node.js通过worker_threads实现)
const { EventEmitter } = require('events');
const threadEmitter = new EventEmitter();
function simulateThreadWork(dependencyThreads = []) {
try {
// 模拟一些工作,可能会抛出错误
if (Math.random() < 0.5) {
throw new ThreadError('模拟线程错误', '当前线程名称');
}
console.log('线程工作完成');
} catch (error) {
if (error instanceof ThreadError) {
// 触发错误事件,并传递错误信息和依赖线程
threadEmitter.emit('error', error, dependencyThreads);
} else {
// 非自定义错误也进行封装
const wrappedError = new ThreadError(error.message, '当前线程名称');
threadEmitter.emit('error', wrappedError, dependencyThreads);
}
}
}
3. 中央错误处理器
const errorHandlers = new Map();
// 注册错误处理函数
function registerErrorHandler(threadName, handler) {
errorHandlers.set(threadName, handler);
}
// 中央错误处理逻辑
threadEmitter.on('error', (error, dependencyThreads) => {
const sourceThread = error.sourceThread;
// 处理当前线程错误
const currentHandler = errorHandlers.get(sourceThread);
if (currentHandler) {
currentHandler(error);
}
// 传播错误到依赖线程
dependencyThreads.forEach(dependentThread => {
const dependentHandler = errorHandlers.get(dependentThread);
if (dependentHandler) {
dependentHandler(error);
}
});
});
4. 使用示例
// 注册错误处理函数
registerErrorHandler('线程1', error => {
console.log('线程1错误处理:', error.message);
// 释放资源等操作
});
registerErrorHandler('线程2', error => {
console.log('线程2错误处理:', error.message);
// 释放资源等操作
});
// 模拟线程工作
simulateThreadWork(['线程2']);
以上代码通过自定义错误类、事件机制和中央错误处理器,实现了多线程环境下错误的传播与捕获,同时考虑了资源管理和避免程序崩溃的问题。实际应用中,需结合Node.js的worker_threads
模块进行多线程的具体实现。