TagIntegration

集成 tag 基类:异常包装与去重日志

基本信息

属性 值
路径 com.github.lunatrius.ingameinfo.tag.TagIntegration
行数 22(本 mod 最短的 tag 类)
子类 5 个第三方 tag 类全部继承它

抽象类 + 嵌套异常

public abstract class TagIntegration extends Tag {
    public static class TagException extends Exception {
        public TagException(Tag tag, Throwable cause) {
            super(tag.getCategory() + "/" + tag.getName(), cause);
        }
    }
    private boolean logged = false;
    protected void log(TagIntegration tag, Throwable ex) {
        if (!this.logged) {
            Reference.logger.error("Tag error!", new TagException(tag, ex));
            this.logged = true;
        }
    }
}

两个设计点

异常消息带定位信息

TagException 的 message 是 category + "/" + name (如 bloodmagic/bmlp),把出错 tag 写进异常消息本身, 配合 logger.error("Tag error!", ex) 输出完整堆栈。

错误只报一次

private boolean logged + if (!this.logged) 构成去重闸门: 同一个集成 tag 无论每 tick 抛多少次异常,只记录第一次。

⚠️ logged 是实例字段而非 static, 而集成 tag 实例是每次注册新建的(见 TagPlayerPotion 的重复注册问题)。 若注册被去重只剩一份实例,去重有效; 若同一 tag 被多路径访问到不同实例,就会重复打日志。

5 个子类

子类 集成
TagBloodMagic BloodMagic
TagGregtech Gregtech
TagSimplyJetpacks SimplyJetpacks
TagTerraFirmaCraft TerraFirmaCraft
TagThaumcraft Thaumcraft

⚠️ 子类必须调用继承来的 log(this, ex) 才有去重效果; 若子类自己 try/catch 并直接 logger.error,去重失效。 5 个子类均使用 log(...)。

⚠️ 本类不覆写 getCategory() / getValue(),两个仍是抽象的 —— 集成 tag 的分类与取值由各子类自己给。

相关