====== LU07: Debugging – Fehler finden und verstehen ======
{{:de:modul:m291:learningunits:lu07:theorie:debugging.png?nolink&400| Debugging: wie ein Detektiv nach Spuren sucht, müssen auch Entwickler:innen den Fehlern auf die Suche gehen.}}
Debugging bedeutet, mit dem Browser oder dem Code-Editor zu **Spuren des Fehlers** nachzuforschen – mit den richtigen Werkzeugen, in der richtigen Reihenfolge.
Ein Fehler, den Sie nicht reproduzieren können, ist schwer zu beheben.\\
Beschreiben Sie den Fehler zuerst genau – nicht „es funktioniert nicht", sondern „wenn ich auf den Button klicke, passiert X statt Y".
===== Warum Debugging wichtig ist =====
Viele Anfänger raten, was falsch sein könnte. Debugging ist das Gegenteil: Sie **prüfen Fakten**.
Eine gute Debugging-Gewohnheit folgt immer dieser Reihenfolge:
^ Schritt ^ Was Sie tun ^ ^ Beispiel ^
| 1. Read | Lesen Sie die Fehlermeldung genau. | Was steht da wirklich? Welche Zeile wird genannt? | ''ReferenceError: e is not defined (script.js:4)'' |
| 2. Reproduce | Lösen Sie den Fehler bewusst aus. | Passiert er immer, oder nur manchmal? Bei welcher Aktion genau? | „Fehler erscheint jedes Mal, wenn ich auf einen Button klicke" |
| 3. Reduce | Grenzen Sie das Problem ein. | Welche Zeile, welche Variable, welches Element ist betroffen? | ''console.log(buttons.length)'' ergibt 0 → Problem liegt im Selector |
| 4. Fix | Ändern Sie eine einzige Sache – nicht mehrere auf einmal. | Danach sofort testen: Hat diese Änderung den Fehler behoben? | Punkt vor Klassennamen ergänzt → ''buttons.length'' ergibt nun 4 |
Oft passiert beim Debugging gar nichts: keine Fehlermeldung, kein Hinweis. Das macht es schwierig. Deshalb brauchen Sie die richtigen Werkzeuge.
===== Die Debugging-Reihenfolge =====
Nicht jedes Werkzeug hilft bei jedem Fehler. Gehen Sie diese Reihenfolge durch:
^ Schritt ^ Werkzeug ^ Hilft bei ^
| 1 | Formatter / Linter | Syntaxfehler (fehlende Klammern, Tippfehler, falsch geschachteltes HTML) |
| 2 | Console | Laufzeitfehler (was passiert, während der Code läuft) |
| 3 | Elements-Tab | Rendering-Fehler (was macht der Browser aus Ihrem CSS/HTML) |
===== Werkzeug 1: Formatter & Linter =====
Bevor Sie die DevTools öffnen: Schauen Sie in den **Code-Editor**. Viele Fehler können gefunden werden, bevor der Code überhaupt im Browser läuft.
==== WebStorm ====
{{:modul:m290_guko:leistungsbeurteilungen:03_lb:webstorm_4x.png?nolink&300| Webstorm Logo}}
WebStorm prüft den Code automatisch im Hintergrund – ohne zusätzliche Extensions. Farbige Unterwellungen bedeuten:
* **Rot** → Fehler (der Code wird nicht korrekt ausgeführt)
* **Gelb** → Warnung (sollte behoben werden)
* **Grau** → Hinweis (Stil-Empfehlung)
{{:de:modul:m291:learningunits:lu07:theorie:screenshot_2026-03-22_at_11.10.17.png?nolink&800| Webstorm Code mit Fehlern. }}
\\
//WebStorm Code mit Fehleranzeige.//
{{:de:modul:m291:learningunits:lu07:theorie:screenshot_2026-03-22_at_11.15.00.png?direct&700| Webstorm Screenshot mit Fehlermeldung. }}
\\
//Fahren Sie mit der Maus über die Markierung – Sie sehen eine Erklärung des Problems.//\\
WebStorm erkennt unter anderem:
* Fehlende Dateiendungen: '''' → //Cannot resolve file 'style'//
* Falsche Anführungszeichen: '''' → //Cannot resolve file '„style.css"'//
* Tippfehler in CSS-Eigenschaften: ''heihgt'' → unbekannte Eigenschaft
=== Formatieren ===
Mit **Ctrl+Alt+L** (Windows) / **Cmd+Alt+L** (Mac) formatieren Sie die ganze Datei (alles wird schön ausgerichtet).
==== VS Code: Prettier + HTMLHint ====
{{:de:modul:m291:learningunits:lu07:theorie:visual-studio-code-4096.png?nolink&200| VS Code Logo}}
{{:de:modul:m291:learningunits:lu07:theorie:prettier-logo.png?nolink&400| Prettier Logo}}
{{:de:modul:m291:learningunits:lu07:theorie:htmlhint.dircoa_t_z1cgbhd.webp?nolink&200 | HTMLHint Logo}}
Für VS Code brauchen Sie zwei separate Extensions, um dasselbe Niveau wie WebStorm zu erreichen:
**Prettier** formatiert den Code automatisch beim Speichern (Einrückung, Strukturierung):
- Extensions-Tab öffnen (Ctrl+Shift+X / Cmd+Shift+X)
- Suchen: **Prettier – Code formatter**, installieren
- Settings öffnen (Ctrl+, / Cmd+,), suchen nach ''format on save'', Checkbox aktivieren
Ab jetzt: **Ctrl+S / Cmd+S** → Code wird automatisch aufgeräumt und eingerückt.
**HTMLHint** prüft die HTML-Struktur und meldet typische Fehler wie falsche Anführungszeichen:
- Suchen: **HTMLHint**, installieren
- Keine weitere Konfiguration nötig – funktioniert sofort
- Website mit Dokumentation aller Regeln: [[https://htmlhint.com|htmlhint.com]]
**Hinweis:** Für CSS gibt es [[https://stylelint.io|Stylelint]] – ein Linter, der ähnlich wie HTMLHint funktioniert, aber für CSS-Dateien.
==== Typische Fehler, die diese Tools erkennen ====
**Falsche Anführungszeichen** (WebStorm & HTMLHint):
**Vorsicht beim Kopieren aus Moodle oder Word:** Textverarbeitungsprogramme ersetzen gerade Anführungszeichen ('' " '') durch typografische („ "). Im Browser-Code führt das zu versteckten Fehlern.\\
Fügen Sie kopierten Code immer als **Plain Text** ein: **Cmd+Shift+V** (Mac) / **Ctrl+Shift+V** (Windows).
**Tippfehler in CSS-Eigenschaften** (WebStorm & VS Code):
/* ❌ 'heihgt' statt 'height' – Browser ignoriert diese Zeile einfach, kein Console-Fehler */
.panel.open {
heihgt: auto;
opacity: 1;
}
/* ✅ Korrekt */
.panel.open {
height: auto;
opacity: 1;
}
{{:de:modul:m291:learningunits:lu07:theorie:screenshot_2026-03-22_at_15.11.10.png?nolink&800|}}
//Fehlermeldung in VS Code: CSS-Eigenschaft falsch geschrieben.//
Dieser Fehler ist besonders tückisch: das Accordion-Panel öffnet sich visuell nicht, obwohl das JavaScript korrekt funktioniert. Die Console zeigt keinen Fehler.
===== Werkzeug 2: Die Browser-Console =====
Die Console ist der direkte Draht zum laufenden JavaScript-Code. Öffnen Sie sie mit **F12 → Console**.
Öffnen Sie die Console, **bevor** Sie anfangen zu raten. Die Fehlermeldung sagt Ihnen meistens genau, was falsch ist – und in welcher Zeile.
==== Fehlermeldungen lesen ====
{{:de:modul:m291:learningunits:lu07:theorie:screenshot_2026-03-22_at_14.49.40.png?nolink&800| Screenshot mit Fehlermeldung in Entwicklertools}}
Fehlermeldungen sehen einschüchternd aus, bedeuten aber meist eines von wenigen Dingen:
^ Fehlermeldung ^ Bedeutung ^ Häufige Ursache ^
| ''TypeError: Cannot read properties of null'' | Sie greifen auf ein Element zu, das nicht existiert | Falscher Selector oder Script im '''' statt vor '''' |
| ''ReferenceError: x is not defined'' | Variable ''x'' existiert an dieser Stelle nicht | Tippfehler im Variablennamen, ''e'' im Callback vergessen |
| ''ReferenceError: Cannot access 'x' before initialization'' | Variable wird vor ihrer Deklaration benutzt | ''let'' / ''const'' zu weit unten im Code |
| ''addEventListener is not a function'' | Das Objekt ist kein DOM-Element | ''querySelector'' hat ''null'' zurückgegeben |
Die Fehlermeldung enthält immer eine **Zeilennummer** – klicken Sie darauf, um direkt zur betroffenen Stelle zu springen.
==== console.log() richtig einsetzen ====
''console.log()'' schreibt Werte in die Console. So sehen Sie, was Ihr Code gerade "denkt".
// ❌ Wenig hilfreich – was ist das genau?
console.log(buttons);
// ✅ Mit Label – sofort lesbar
console.log('buttons:', buttons);
console.log('Anzahl gefundene Buttons:', buttons.length);
// ✅ Fehler bewusst kennzeichnen (erscheint rot in der Console)
console.error('Kein Element gefunden für Selector:', selector);
==== Read → Reproduce → Reduce: Ein konkretes Beispiel ====
Hier ein typischer Fehler aus dem Accordion-Projekt:
// ❌ Fehler: 'e' wurde im EventListener nicht deklariert
buttons.forEach((button) => {
button.addEventListener('click', () => { // ← 'e' fehlt als Parameter
const panelElement = e.target.nextElementSibling;
// ...
});
});
{{:de:modul:m291:learningunits:lu07:theorie:screenshot_2026-03-22_at_14.49.40.png?direct&900| Screenshot mit Fehlermeldung in Entwicklertools}}
**Was passiert:**
* **Read**: Console zeigt ''Uncaught ReferenceError: e is not defined''
* **Reproduce**: Jedes Mal beim Klick auf einen Button
* **Reduce**: Das Problem liegt in Zeile mit ''e.target'' – ''e'' ist nirgends definiert
* **Fix**: Den Parameter ''e'' in der Klammer (e) ergänzen
// ✅ Korrekt: 'e' als Parameter deklariert
buttons.forEach((button) => {
button.addEventListener('click', (e) => { // ← 'e' als Parameter
const panelElement = e.target.nextElementSibling;
// ...
});
});
==== Script-Position: Ein stiller, häufiger Fehler ====
Wird die Verlinkung zum JavaScript-File im ''
'' Teil des HTML angegeben, dann wird der JS-Code schon ausgeführt, ohne dass die Elemente im HTML durch den Browser erstellt (geparst) wurden. Das kann dazu führen, dass ''querySelector()'' null zurückgibt, obwohl im HTML-Code das Element vorhanden ist.
=== Script im - falsch! ===
{{:de:modul:m291:learningunits:lu07:theorie:script_im_head.png?nolink&700| Script im Head}}
=== Script vor - gut! ===
{{:de:modul:m291:learningunits:lu07:theorie:script_before_body.png?nolink&700| Script im Body}}
Wenn ''document.querySelector(...)'' ''null'' zurückgibt, obwohl das Element im HTML vorhanden ist, ist dies die häufigste Ursache.
===== Werkzeug 3: Der Elements-Tab =====
Der Elements-Tab zeigt, was der Browser **tatsächlich** aus Ihrem Code gemacht hat – nicht was Sie geschrieben haben, sondern was nach dem Parsen und Rendern übrig bleibt.
{{:de:modul:m291:learningunits:lu07:theorie:screenshot_2026-03-22_at_21.53.20.png?nolink&800| Elements-Tab im Browser}}
==== CSS live ausprobieren ====
Workflow:
- Elements-Tab öffnen (F12 → Elements)
- Rechts: Styles-Panel
- Eigenschaft anklicken und Wert ändern
- Änderung wird direkt im Browser gerendert und sichtbar
Wenn der Look stimmt: dann erst in die CSS-Datei übertragen.
Deaktivierte CSS-Regeln (durchgestrichen) bedeuten: eine andere Regel mit höherer Spezifität (s. CSS Kaskade LU02) gewinnt oder es gibt ein Syntax-Fehler.
===== Das Debugging-Protokoll =====
Dieses Format hilft, strukturiert vorzugehen – und aus Fehlern zu lernen. Füllen Sie es aus, wenn Sie einen Bug gefunden haben:
^ Schritt ^ Frage ^ Beispiel ^
| **1. Beobachten** | Was passiert genau? | „Wenn ich auf Frage 2 klicke, passiert gar nichts" |
| **2. Hypothese** | Was könnte die Ursache sein? | „querySelector findet den Button vielleicht nicht" |
| **3. Testen** | Wie prüfe ich das? | ''console.log('Buttons:', buttons.length)'' |
| **4. Fazit** | Was habe ich gelernt? | „buttons.length war 0 – Punkt vor Klassennamen fehlte" |
===== Zusammenfassung =====
^ Werkzeug ^ Wann einsetzen ^
| **Formatter / Prettier** | Zuerst immer – Syntaxfehler, Tippfehler in CSS-Eigenschaften, falsche Anführungszeichen |
| **Console** | Wenn etwas passiert oder nicht passiert – Fehlermeldung lesen, ''console.log()'' einsetzen, Variablenwerte prüfen |
| **Elements-Tab** | Wenn das Layout falsch aussieht – CSS live anpassen, Computed-Tab prüfen |