Kodokon kodokon.com

Debugging und Robustheit: try/catch, fortgeschrittene Konsole, eigene Fehler

Baue eine explizite Fehlerstrategie mit eigenen Klassen, gut platzierten catch-Grenzen und einer Konsole, die du voll ausnutzt.

9 Min. · 3 Fragen

Diese Lektion in Kodokon öffnen

Bei Robustheit geht es nicht darum, jeden Fehler abzufangen, sondern ihn an der richtigen Stelle abzufangen. Faustregel aus der Praxis: Scheitere schnell und laut, so nah wie möglich am Bug (Validierung, Invarianten), und fange nur an den Grenzen ab, an denen du wirklich reagieren kannst: eine Meldung zeigen, erneut versuchen, protokollieren. Ein try/catch, das nichts Nützliches tut, macht den Code nicht sicherer; es macht Fehler stumm.

JAVASCRIPT
function parseConfig(json) {
  try {
    return JSON.parse(json);
  } catch (error) {
    console.error("Unreadable config:", error.message);
    throw error; // rethrow: nothing can be fixed here
  } finally {
    console.log("Finished reading configuration");
  }
}
Protokollieren, dann erneut werfen: Die Grenze darüber entscheidet.

Reine Zeichenketten ergeben keine Fehlerstrategie. Erweitere Error, um Klassen zu erstellen, die strukturierte Daten tragen (HTTP-Status, ungültiges Feld) und die sich mit instanceof unterscheiden lassen. Seit ES2022 verkettet die cause-Option den ursprünglichen Fehler mit dem übergeordneten: Du legst eine klare fachliche Meldung offen, ohne die technische Spur zu verlieren.

JAVASCRIPT
class ApiError extends Error {
  constructor(message, status, options) {
    super(message, options);
    this.name = "ApiError";
    this.status = status;
  }
}
try {
  const low = new Error("socket timeout");
  throw new ApiError("Profile unavailable", 503,
    { cause: low });
} catch (error) {
  if (error instanceof ApiError) {
    console.error(error.status, error.cause.message);
  }
}
Ein unterscheidbarer fachlicher Fehler mit erhaltener technischer Ursache.

Die Konsole bietet viel mehr als log: console.table reiht Sammlungen von Objekten auf, group/groupEnd verschachtelt die Ausgabe, time/timeEnd misst eine Dauer, console.assert protokolliert nur, wenn die Bedingung falsch ist, und console.trace gibt den aktuellen Aufrufstapel aus. Zusammen schlagen diese Werkzeuge einen Regen anonymer log-Aufrufe mit Leichtigkeit.

JAVASCRIPT
const users = [
  { name: "Ada", role: "admin" },
  { name: "Linus", role: "dev" },
];
console.table(users);
console.group("Checks");
console.assert(users.length > 0, "Empty list");
console.time("sort");
users.sort((a, b) => a.name.localeCompare(b.name));
console.timeEnd("sort");
console.groupEnd();
Strukturierte Ausgabe: Tabelle, Gruppe, Assertion und Timer.

Wissenscheck

Stelle sicher, dass du die wichtigsten Punkte dieser Lektion behalten hast.

  1. Wann läuft der finally-Block?
    • Nur wenn kein Fehler geworfen wurde
    • Nur wenn das catch ausgelöst wurde
    • In jedem Fall, auch nach einem return oder einem throw
  2. Wofür ist die cause-Option beim Erzeugen eines Fehlers da?
    • Um zu verhindern, dass sich der Fehler ausbreitet
    • Um den ursprünglichen Fehler anzuhängen und den technischen Kontext zu bewahren
    • Um den HTTP-Statuscode automatisch zu setzen
    • Um ein neues catch auszulösen
  3. Wie verhält sich console.assert(condition, message)?
    • Es protokolliert die Meldung nur, wenn die Bedingung falsch ist
    • Es wirft eine Ausnahme, wenn die Bedingung falsch ist
    • Es protokolliert die Meldung nur, wenn die Bedingung wahr ist