You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:55:18