Fehlerbehandlung in JavaScript: try/catch und fortgeschrittene Techniken in Node.js

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Fehlerbehandlung in JavaScript: try/catch und mehr



Fehlerbehandlung ist eine der wichtigsten Aufgaben bei der Entwicklung mit JavaScript, insbesondere in der Node.js-Umgebung, wo die Stabilität einer Serveranwendung direkt die Benutzererfahrung beeinflusst. Unbehandelte Ausnahmen können zum Absturz des gesamten Prozesses und zu Datenverlust führen. In diesem Artikel behandeln wir nicht nur den klassischen try/catch-Block, sondern auch fortgeschrittene Techniken: die Arbeit mit finally, das Erstellen benutzerdefinierter Fehlertypen, die Behandlung asynchroner Fehler und Best Practices für Node.js.



1. Grundlagen: try, catch und finally



Der try/catch-Block ist der grundlegende Mechanismus zum Abfangen synchroner Ausnahmen. Wenn im try-Block ein Fehler auftritt, wird die Ausführung sofort an catch übergeben. Der finally-Block wird immer ausgeführt – unabhängig davon, ob ein Fehler aufgetreten ist oder nicht. Dies ist nützlich, um Ressourcen freizugeben (Schließen von Dateien, Verbindungen).



const fs = require('fs');

function readConfig(path) { try { const data = fs.readFileSync(path, 'utf8'); console.log('Konfiguration geladen'); return JSON.parse(data); } catch (err) { console.error('Fehler beim Lesen der Konfiguration:', err.message); return null; } finally { console.log('Leseversuch abgeschlossen'); }}

const config = readConfig('./config.json');console.log(config); // null bei Fehler


Wichtig: catch fängt nur Fehler ab, die im try-Block aufgetreten sind. Fehler in catch oder finally bleiben unbehandelt.



2. Fehlertypen in JavaScript und Node.js



In JavaScript gibt es mehrere eingebaute Fehlertypen, die alle von Error erben:



  • SyntaxError – Syntaxfehler beim Parsen von Code.
  • ReferenceError – Zugriff auf eine nicht existierende Variable.
  • TypeError – Ungültiger Datentyp (z. B. Aufruf von etwas, das keine Funktion ist).
  • RangeError – Wert außerhalb des gültigen Bereichs.
  • URIError – Fehler bei der Arbeit mit URI (encodeURI/decodeURI).


In Node.js kommen AssertionError (aus dem Modul assert) und Systemfehler (EACCES, ENOENT usw.) aus dem Modul fs hinzu, die den Fehlercode in der Eigenschaft code enthalten.



try {  require('fs').readFileSync('/nonexistent');} catch (err) {  if (err.code === 'ENOENT') {    console.log('Datei nicht gefunden');  } else {    console.log('Anderer Fehler:', err.message);  }}


3. Erstellen benutzerdefinierter Fehler



Für eine genauere Kontrolle über die Fehlerbehandlungslogik wird empfohlen, eigene Fehlerklassen zu erstellen, die Error erweitern. Dies ermöglicht es, Fehler der Geschäftslogik von Systemfehlern zu unterscheiden.



class ValidationError extends Error {  constructor(message, field) {    super(message);    this.name = 'ValidationError';    this.field = field;  }}

class DatabaseError extends Error { constructor(message, query) { super(message); this.name = 'DatabaseError'; this.query = query; }}

function saveUser(user) { if (!user.email) { throw new ValidationError('Email ist erforderlich', 'email'); } // Simulation eines DB-Fehlers throw new DatabaseError('Verbindungstimeout', 'INSERT INTO users');}

try { saveUser({ name: 'Ivan' });} catch (err) { if (err instanceof ValidationError) { console.log(`Feld ${err.field}: ${err.message}`); } else if (err instanceof DatabaseError) { console.error(`DB-Fehler (${err.query}): ${err.message}`); // Wiederholungsversuch oder Protokollierung } else { console.error('Unbekannter Fehler:', err); }}


Die Verwendung von instanceof ermöglicht den Aufbau von Handler-Ketten, ohne auf die Überprüfung von String-Codes zurückgreifen zu müssen.

Blogs

Buchempfehlungen