При работе с idb-keyval ключевым аспектом является
корректная обработка возможных ошибок, возникающих при взаимодействии с
IndexedDB. Даже простые операции чтения и записи могут завершиться
неудачно из-за отсутствия доступа к базе данных, повреждения хранилища
или ограничений браузера. В JavaScript для этого используются
конструкции try/catch, позволяющие перехватывать исключения
и корректно реагировать на них.
import { get, set } from 'idb-keyval';
async function saveData(key, value) {
try {
await set(key, value);
console.log('Данные успешно сохранены');
} catch (error) {
console.error('Ошибка при сохранении данных:', error);
}
}
В этом примере любой сбой при записи в IndexedDB будет пойман блоком
catch, что предотвращает падение приложения и позволяет
вести журнал ошибок.
Чтение данных из idb-keyval также может вызвать
исключения. Важность использования try/catch особенно
заметна при работе с данными, которые могут отсутствовать или быть
повреждены.
async function loadData(key) {
try {
const value = await get(key);
if (value === undefined) {
console.warn(`Данные с ключом "${key}" не найдены`);
return null;
}
return value;
} catch (error) {
console.error('Ошибка при чтении данных:', error);
return null;
}
}
Здесь добавлено дополнительное логирование случая, когда данных нет в хранилище. Это помогает отличить ошибки IndexedDB от простого отсутствия значения.
При работе с несколькими операциями важно обрабатывать каждую
отдельно или объединять их в один блок try/catch в
зависимости от желаемой логики.
import { get, set, del } from 'idb-keyval';
async function manageUserSettings(settings) {
try {
await set('theme', settings.theme);
await set('language', settings.language);
const savedTheme = await get('theme');
const savedLanguage = await get('language');
console.log('Текущие настройки:', { savedTheme, savedLanguage });
} catch (error) {
console.error('Ошибка при управлении настройками пользователя:', error);
}
}
Использование одного блока try/catch позволяет
перехватывать любые ошибки в цепочке операций, но если требуется
обработка каждого действия отдельно, можно обернуть каждую функцию
await в свой try/catch.
Ошибки в idb-keyval чаще всего происходят из-за
ограничений IndexedDB, включая:
try/catch позволяет аккуратно перехватывать эти ошибки и
принимать соответствующие меры, например, очистку устаревших данных или
уведомление пользователя.
async function clearIfError(key) {
try {
const value = await get(key);
console.log('Данные:', value);
} catch (error) {
console.warn('Ошибка при доступе к IndexedDB, очищаем ключ:', key);
try {
await del(key);
} catch (deleteError) {
console.error('Ошибка при удалении ключа:', deleteError);
}
}
}
В данном примере показан паттерн вложенных блоков
try/catch для обработки ошибок как при чтении, так и при
удалении данных, что обеспечивает устойчивость приложения.
idb-keyval полностью основан на промисах. Любая
асинхронная функция, использующая await, должна быть
защищена от исключений через try/catch, чтобы избежать
необработанных ошибок промисов:
async function batchSave(items) {
for (const [key, value] of Object.entries(items)) {
try {
await set(key, value);
} catch (error) {
console.error(`Не удалось сохранить ${key}:`, error);
}
}
}
Такой подход позволяет продолжать выполнение цикла даже при ошибках отдельных операций, не прерывая сохранение остальных данных.
Для надежных приложений имеет смысл логировать ошибки и при
необходимости реализовывать повторные попытки операций. Комбинация
try/catch и цикла с лимитом повторов позволяет повысить
устойчивость к временным сбоям IndexedDB:
async function saveWithRetry(key, value, attempts = 3) {
for (let i = 0; i < attempts; i++) {
try {
await set(key, value);
console.log(`Данные сохранены после ${i + 1} попытки`);
return;
} catch (error) {
console.warn(`Попытка ${i + 1} не удалась:`, error);
}
}
console.error('Все попытки сохранения данных не удались');
}
Этот метод полезен при работе с ненадежными хранилищами или при возможных временных блокировках IndexedDB.
try/catch при работе с
асинхронными функциями idb-keyval.try/catch помогают локализовать
ошибки и минимизировать влияние на другие операции.Такой подход обеспечивает стабильную работу приложений и защищает
данные при работе с IndexedDB через библиотеку
idb-keyval.