Typescript自定义Error类调用Logger不执行日志写入问题求助
可能的原因及解决办法
1. 继承Error时的原型链与属性绑定问题
ES6继承Error类时,部分JS运行环境(如旧版Node.js)不会自动完成原型链绑定和message属性赋值,可能导致后续方法调用异常。可以手动修正:
export class SystemError extends Error { private logger: Logger; constructor(message: string) { super(message); // 手动设置原型链,确保this上下文正确 Object.setPrototypeOf(this, SystemError.prototype); // 手动绑定message,避免部分环境下super后this.message为空 this.message = message; this.logger = Logger.getInstance(); this.logger.logError(this.message); } }
2. Logger.logError内部异常被掩盖
如果logError方法内部存在错误(比如日志路径不存在、文件写入权限不足),由于代码在Error构造函数中执行,该错误会被静默忽略,导致看起来没执行。可以临时添加调试和捕获逻辑:
constructor(message: string) { super(message); Object.setPrototypeOf(this, SystemError.prototype); this.message = message; try { this.logger = Logger.getInstance(); console.log("[调试] Logger实例已获取"); this.logger.logError(this.message); console.log("[调试] logError方法已调用"); } catch (err) { console.error("[错误] logError执行失败:", err); } }
通过调试日志确认代码执行流程,同时捕获隐藏的内部错误。
3. 异步日志写入被中断
如果logError是异步写入(比如用fs.writeFile),构造函数执行完成抛出错误后,事件循环可能来不及处理异步操作,导致日志未写入。可以改成同步写入:
// 在Logger类中修改logError为同步实现 logError(message: string) { fs.writeFileSync(this.logFilePath, `[ERROR] ${new Date().toISOString()}: ${message}\n`, { flag: 'a' }); }
若必须用异步,需确保异步操作能完整执行,但不建议在Error构造函数中处理异步逻辑。
4. Logger单例未完成初始化
确认Logger.getInstance()返回的实例是否已完成初始化(如日志目录是否创建、配置是否加载)。可以添加初始化校验:
constructor(message: string) { super(message); Object.setPrototypeOf(this, SystemError.prototype); this.message = message; this.logger = Logger.getInstance(); if (!this.logger.isReady) { console.error("[错误] Logger实例未初始化完成"); return; } this.logger.logError(this.message); }
内容的提问来源于stack exchange,提问作者Wurzelseppi
相关产品推荐
相关产品推荐

