Regel
Umgang mit Fehler in auffangen Blöcken.
Leere catch Blöcke geräuschlos schlucken Fehler,
macht Fehlersuche erschwert.
Unterstützte Sprachen: Java, C, C++, PHP, JavaScript,
TypeScript, Go, PythonEinführung
Leere Catch-Blöcke sind eines der gefährlichsten Anti-Patterns im Produktionscode. Wenn Ausnahmen abgefangen, aber nicht behandelt werden, verschwindet der Fehler ohne eine Spur. Die Anwendung läuft mit beschädigten Zuständen, ungültigen Daten oder fehlgeschlagenen Operationen weiter, die die Ausführung hätten stoppen müssen. Die Benutzer sehen stille Fehler, bei denen Funktionen nicht funktionieren, erhalten aber keine Fehlermeldungen. Die Betriebsteams haben keine Protokolle zur Fehlersuche. Der einzige Hinweis darauf, dass etwas nicht in Ordnung ist, kommt Stunden oder Tage später, wenn kaskadenartige Ausfälle das System unbrauchbar machen.
Warum das wichtig ist
Fehlersuche und Fehlerbehebung: Leere Catch-Blöcke eliminieren Fehlerprotokolle. Ingenieure haben keine Stapelverfolgung, keine Fehlermeldung und keinen Hinweis darauf, wann oder wo der Fehler aufgetreten ist, was es nahezu unmöglich macht, Probleme zu reproduzieren.
Stille Datenbeschädigung: Wenn Datenbankoperationen oder API-Aufrufe innerhalb leerer Catch-Blöcke fehlschlagen, fährt die Anwendung fort, als wären sie erfolgreich gewesen. Datensätze werden teilweise aktualisiert, Transaktionen sind unvollständig, und wenn die Beschädigung entdeckt wird, ist der Prüfpfad verschwunden.
Sicherheitsschwachstellen: Leere Catch-Blöcke verdecken Sicherheitsfehler wie Authentifizierungsfehler oder Autorisierungsprüfungen. Ein Angreifer, der eine Ausnahme in einem sicherheitskritischen Pfad auslöst, könnte die Schutzmaßnahmen vollständig umgehen, wenn der Fehler stillschweigend verschluckt wird.
Kaskadierende Ausfälle: Wenn Fehler verschluckt werden, läuft die Anwendung in einem ungültigen Zustand weiter. Nachfolgende Vorgänge, die vom Ergebnis des fehlgeschlagenen Vorgangs abhängen, schlagen ebenfalls fehl, wodurch eine Kette von Fehlern entsteht, die die Ingenieure von der eigentlichen Ursache ablenkt.
Code-Beispiele
❌ Nicht konform:
async function updateUserProfile(userId, profileData) {
try {
await db.users.update(userId, profileData);
await cache.invalidate(`user:${userId}`);
await searchIndex.update(userId, profileData);
} catch (error) {
// TODO: handle error
}
return { success: true };
}Warum es falsch ist: Wenn ein Vorgang fehlschlägt, wird der Fehler stillschweigend ignoriert und die Funktion gibt den Erfolg zurück. Die Datenbank könnte aktualisiert werden, aber die Cache-Invalidierung könnte fehlschlagen, so dass die Daten veraltet sind. Oder die Aktualisierung des Suchindex schlägt fehl, so dass der Benutzer nicht mehr gesucht werden kann, ohne dass ein Protokoll oder eine Warnung auf das Problem hinweist.
✅ Konform:
async function updateUserProfile(userId, profileData) {
try {
await db.users.update(userId, profileData);
await cache.invalidate(`user:${userId}`);
await searchIndex.update(userId, profileData);
return { success: true };
} catch (error) {
logger.error('Failed to update user profile', {
userId,
error: error.message,
stack: error.stack
});
throw new ProfileUpdateError(
'Unable to update profile',
{ cause: error }
);
}
}
Warum das wichtig ist: Jeder Fehler wird mit dem Kontext protokolliert und liefert Informationen zur Fehlersuche. Der Fehler wird an den Aufrufer weitergegeben und ermöglicht eine angemessene Fehlerbehandlung auf der entsprechenden Ebene. Überwachungssysteme können auf diese Fehler aufmerksam machen, und die Anwendung schlägt schnell fehl, anstatt mit einem ungültigen Zustand fortzufahren.
Schlussfolgerung
Leere Catch-Blöcke sind im Produktionscode niemals akzeptabel. Jede abgefangene Ausnahme muss mindestens protokolliert werden, und die meisten müssen an den Aufrufer weitergegeben werden oder spezifische Wiederherstellungsmaßnahmen auslösen. Wenn Sie einen Fehler wirklich ignorieren müssen, dokumentieren Sie den Grund dafür mit einem Kommentar, der die geschäftliche Rechtfertigung erläutert. Die Vorgabe sollte immer sein, Fehler explizit zu behandeln und sie nicht stillschweigend zu verwerfen.
.avif)
