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 的分类与取值由各子类自己给。
相关
- Tag - 直接父类
- PluginLoader - 子类的注册时机