04 — Fehlerstrategie fuer kaputte Mods #5
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Teil der Map #1 · Type:
wayfinder:grilling· Blocked by: #4Was passiert bei kaputtem Mod-TOML, und wie sieht das in Rust aus? Explizites Rust-Lernticket: heute panickt parse().
Volle Fragestellung (kanonisch):
.scratch/rustkeep-1.0/issues/04-fehlerstrategie.mdAufgeloest in
145b82b. Kanonische Fassung:.scratch/rustkeep-1.0/issues/04-fehlerstrategie.mdZwei Klassen, zwei Einheiten
Syntax ist ein Datei-Fehler, alles Semantische ein Eintrags-Fehler.
Das ist nicht gratis:
toml::from_strmititems: Vec<Item>scheitert komplett, sobald ein einziger Eintrag ein kaputtes Feld hat — das Versprechen aus #4 waere also genau dann gebrochen, wenn 200 Gegenstaende in einer Datei stehen. Deshalb zweistufig: erstVec<Spanned<toml::Value>>je Tabelle, dann jeder Eintrag einzeln in seinen Typ. Etwa zehn Zeilen. Kaputte TOML-Syntax reisst weiterhin die ganze Datei mit — da kommt der Parser nicht weiter.Harte Fehler — genau drei
dependsnicht installiert,depends-Reihenfolge verletzt,corenicht gefunden. Alle drei: stderr undexit(1), das TUI startet gar nicht erst.coreist sonst kein Sonderfall — ein kaputter Eintrag darin ist eine Warnung wie ueberall, sonst waere die Privilegierung wieder da, die #4 abgeschafft hat. Abgesichert wird es durch einen Test statt durch Laufzeitlogik (siehe unten). Ein nicht schreibbares Log ist ausdruecklich kein harter Fehler.Warnungen
Waehrend des Ladens in einem
Vec<String>gesammelt, danach nachdata_dir()/rustkeep/logs/load-20260812-112305.log. Die letzten zehn bleiben liegen, aeltere werden beim Schreiben geloescht. Sauberer Lauf legt keine Datei an.Auf dem Startbildschirm steht eine Zeile mit Anzahl und Dateiname — kein Report-Screen, das kann ein Texteditor besser. Keine Schweregrade: jeder Fall ist "Warnung, verworfen".
Meldungsformat
Mod-ID vorne, weil sie bei zwoelf Mods die einzige Angabe ist, mit der ein Spieler weiss, wen er anschreiben muss.
toml::de::Errorliefertspan()undmessage(), aber keine Zeile — die istinput[..span.start].lines().count(). Keine Spalte. Eintrag ohne lesbareidheisst nach seiner Position:items[3].Rust-Seite
Handgeschriebenes
enum LoadErrormit drei Varianten und eigenemimpl Display. Keinthiserror(Proc-Macro-Dependency fuer zehn gesparte Zeilenmatch— und das Schreiben ist der Lernzweck), keinanyhow(der Fehlertyp ist hier gerade nicht egal), keinimpl std::error::Error, solange niemandBox<dyn Error>braucht.Warnungen als zweiter Rueckgabewert, nicht als Feld in
Registries— Diagnose gehoert nicht in die Spieldaten. DieResult-Kette endet vormain:eprintln!("{e}")plusexit(1), weilmain() -> Result<..>ueberDebugdruckt.Panic-Grenze ist die Datenherkunft: Alles aus einer TOML ist
Result, alles aus dem eigenen Code darf panicken.unwrap()auf Modder-Daten ist ausnahmslos falsch — genau das tutitems.rs::parse()heute.Check
Ein
#[test], dermods/core/laedt und auf null Warnungen prueft. Ein kaputtes Kernspiel faellt damit beimcargo testauf statt beim Spieler.Folgen
items.rs::parse()verliert seinpanic!,main()bekommt stderr-plus-exit,logs/-Verwaltung kommt dazu