首页 > 解决方案 > 只有在没有错误的情况下才执行 try 语句

问题描述

我有一条try...catch语句检查它是否可以为对象的属性赋值,然后将其存储在本地存储中而不超过配额。

我在这里遇到的问题是,如果它超过配额,它仍然为该属性分配了一个新值。

我不确定如何解决这个问题。我尝试过嵌套 try 语句并使用 finally 语句,但我还没有弄清楚。

let storageFiles = JSON.parse(localStorage.getItem('storageFiles')) || {};
const image = document.getElementsByTagName('img')[0];

try {
    // I need this block to only be executed if there's no error to catch
    // but I will still need to assign the value to the property before
    // saving it to local storage

    storageFiles.source = image.src;
    localStorage.setItem('storageFiles', JSON.stringify(storageFiles));
}
catch(err) {
    console.log('Local storage error: ' + err);
}

本质上,我正在寻找的是一种仅在存在或不会出现错误时才执行 try 语句中的代码的方法。

我可以采取不同的方法吗?

标签: javascripttry-catch

解决方案


Storage界面中没有任何内容可以让您提前检查存储操作是否会成功。JavaScript 中没有任何东西可以让您回滚代码的效果(例如回滚数据库事务)。您必须运行代码。

我在这里遇到的问题是,如果它超过配额,它仍然为该属性分配了一个新值。

我猜你的意思是你解析source的对象的属性。storageFiles

至少想到两个解决方案:

  1. 如果没有保存,您可以保留原始内容并还原更改:

    let storageFiles = JSON.parse(localStorage.getItem('storageFiles')) || {};
    const image = document.getElementsByTagName('img')[0];
    const source = oldSource;
    try {
        storageFiles.source = image.src;
        localStorage.setItem('storageFiles', JSON.stringify(storageFiles));
    }
    catch(err) {
        storageFiles.source = oldSource;
        console.log('Local storage error: ' + err);
    }
    
  2. 失败时重新解析对象:

    let storageFiles = JSON.parse(localStorage.getItem('storageFiles')) || {};
    const image = document.getElementsByTagName('img')[0];
    try {
        storageFiles.source = image.src;
        localStorage.setItem('storageFiles', JSON.stringify(storageFiles));
    }
    catch(err) {
        storageFiles = JSON.parse(localStorage.getItem('storageFiles')) || {};
        console.log('Local storage error: ' + err);
    }
    

推荐阅读