Signatur
Beschreibung
Die schreibgeschützte Eigenschaft error einer IDBTransaction enthält eine DOMException, die erklärt, warum eine Transaktion abgebrochen wurde. Man liest sie typischerweise im abort- oder error-Handler der Transaktion aus, um den Fehler zu protokollieren, dem Nutzer eine Meldung anzuzeigen oder eine Wiederholung anzustoßen.
Der Wert ist null, solange die Transaktion noch läuft, wenn sie erfolgreich abgeschlossen wurde (complete) oder wenn sie bewusst per transaction.abort() abgebrochen wurde. Nur wenn die Transaktion durch einen Fehler abbricht, ist ein Fehlerobjekt gesetzt.
Typische Werte von error.name:
ConstraintError– eine Anfrage verletzte eine Bedingung (z. B. doppelter Schlüssel beiadd()oder einunique-Index) und der Fehler wurde nicht mitevent.preventDefault()abgefangen.QuotaExceededError– der verfügbare Speicherplatz des Ursprungs ist erschöpft.UnknownError– ein interner Fehler, z. B. ein I/O-Problem beim Schreiben auf die Festplatte.AbortError– die Transaktion wurde von außen abgebrochen, etwa weil die Datenbankverbindung geschlossen wurde.
Schlägt eine einzelne Anfrage fehl, steigt ihr error-Ereignis zur Transaktion auf. Ohne preventDefault() wird die Transaktion abgebrochen und transaction.error übernimmt den Fehler der auslösenden Anfrage.
Rückgabewert
DOMException mit name und message der Abbruchursache oder null, wenn kein Fehler aufgetreten ist, die Transaktion noch aktiv ist oder per abort() abgebrochen wurde.Beispiele
Fehlerursache im abort-Handler auslesen
const openReq = indexedDB.open('shop', 1);
openReq.onupgradeneeded = () => {
openReq.result.createObjectStore('kunden', { keyPath: 'id' });
};
openReq.onsuccess = () => {
const db = openReq.result;
const tx = db.transaction('kunden', 'readwrite');
const store = tx.objectStore('kunden');
store.add({ id: 1, name: 'Anna' });
store.add({ id: 1, name: 'Doppelt' }); // gleicher Schlüssel -> ConstraintError
tx.oncomplete = () => console.log('Gespeichert, error =', tx.error);
tx.onabort = () => {
console.log('Abgebrochen:', tx.error?.name);
};
};
Bewusster Abbruch: error bleibt null
const req = indexedDB.open('shop', 1);
req.onsuccess = () => {
const tx = req.result.transaction('kunden', 'readwrite');
tx.objectStore('kunden').put({ id: 2, name: 'Ben' });
tx.onabort = () => {
// Manueller Abbruch per abort() setzt keinen Fehler
console.log('error:', tx.error);
};
tx.abort();
};
Transaktion als Promise mit sauberer Fehlerweitergabe
const txDone = (tx) =>
new Promise((resolve, reject) => {
tx.oncomplete = () => resolve();
tx.onerror = () => reject(tx.error);
tx.onabort = () =>
reject(tx.error ?? new DOMException('Transaktion abgebrochen', 'AbortError'));
});
const speichern = async (db, datensaetze) => {
const tx = db.transaction('kunden', 'readwrite');
const store = tx.objectStore('kunden');
datensaetze.forEach((d) => store.put(d));
try {
await txDone(tx);
console.log('Alle Datensätze gespeichert');
} catch (err) {
if (err.name === 'QuotaExceededError') {
console.warn('Speicher voll – bitte alte Daten löschen.');
} else {
console.error(`${err.name}: ${err.message}`);
}
}
};
// Wichtig · Fallstricke
nullheißt nicht immer Erfolg: Auch nachtx.abort()isterrornull. Ob eine Transaktion erfolgreich war, zeigt zuverlässig nur dascomplete-Ereignis.- Fehler abfangen verhindert den Abbruch: Ruft man im
error-Handler einer Anfrageevent.preventDefault()auf, läuft die Transaktion weiter undtransaction.errorbleibtnull. - Zeitpunkt: Lies die Eigenschaft erst in
onabort/onerroraus. Solange die Transaktion aktiv ist, ist der Wertnull. Ältere Spezifikationen warfen hier einenInvalidStateError. - Kompatibilität: Ältere Browser lieferten statt einer
DOMExceptioneinDOMError-Objekt. Beide habenname, daher ist der Vergleich übererror.nameam robustesten. Heute unterstützen alle modernen Browser die Eigenschaft. Sie steht auch in Web Workern zur Verfügung. QuotaExceededErrorkann auch im privaten Modus auftreten, weil Browser dort oft deutlich weniger Speicher erlauben.