try-catch 是为了防止或处理错误吗? (在 JavaScript 中)

问题描述 投票:0回答:3

最近我和同事讨论了如何使用

try
catch
来通知错误或避免错误。

这是我同事的方法:

import Config from 'config';

export const getUserFromLocalStorage = () => {
  const key = Object.keys(localStorage).find(value => value === `${Config.applicationId}/currentUser`);

  try {
    return key ? JSON.parse(localStorage[key]) : {};
  } catch (e) {
    return {};
  }
};

这意味着,他不关心给定的错误,他只是返回一个对象以继续该过程

我的是:

import Config from 'config';

export const getUserFromLocalStorage = () => {
  const key = Object.keys(localStorage).find(value => value === `${Config.applicationId}/currentUser`);

  try {
    return key ? JSON.parse(localStorage[key]) : {};
  } catch (e) {
    console.log('the given error', e); // Just simple notifier for this example
  }
}; 

但是我的方法仍然有一个问题,那就是它会返回

undefined
(这可能会在我的应用程序内部崩溃),可以使用
finally
轻松修复它并返回默认值,但这听起来不是一个好的做法对我来说。

问题

那么如果需要的话,使用

try
catch
finally
来平衡什么,才能使我的应用程序稳定。
我们的做法有问题吗?
特别是,我们不能相信来自
localStorage
的数据,那么此实施的最佳方法是什么?

javascript local-storage try-catch web-storage
3个回答
3
投票

由于

finally
在任何一种情况下都会执行,无论是否抛出了某些东西,它都不是返回默认值的地方。是否需要详细记录错误也是值得怀疑的。这完全取决于某件事是“预期错误”还是真正的“异常情况”以及谁可以对此采取措施。 存储的值是否很可能是无效的 JSON?您有一个“备用计划”来应对这种情况吗?用户和/或开发人员对此无能为力?那就不要用它来打扰任何人。也许您想要 console.log 一条可能有助于调试的消息,但除此之外,只需继续程序流程即可。如果 a) 用户没有发起该操作,并且 b) 他们也无能为力,那么肯定没有必要用

alert

来骚扰用户。


需要考虑的事项:

是否

catch
    一开始就有错误:
  1. 这是程序流程中可能自然发生的预期错误吗?

    这是一个错误,您可以采取措施吗?
    • 如果发现错误,您有计划做什么吗?
    • 是否记录错误:
  2. 这个日志对任何人有什么好处吗?

    有人会看到该日志条目吗?
    • 它是否为任何人提供了任何可以解决问题的有用信息?
    • 是否骚扰用户某件事:
  3. 用户是否发起了操作?

    用户是否期望某种形式的响应,积极还是消极?
    • 用户可以采取任何措施来解决问题吗?
    • 是否返回空对象或什么也不返回/
    null
  4. /
undefined

取决于函数的职责是什么。该函数是否定义为始终返回一个对象?那么它应该从

return {}
catch
。或者当预期的对象不存在时,“无”是一个有效的响应吗?那么也许
return false

总的来说,你同事的做法对我来说似乎非常合理。
    

在这种特定情况下,当您使用

localStorage

1
投票

我使用的模式如下:


const DEFAULT_VALUE = {}; try { const result = JSON.parse(result); return result || DEFAULT_VALUE; } catch (e) { console.warn('Error parsing result', e); } return DEFAULT_VALUE;

这样,您就可以拥有一致的错误处理和默认值回退。

一般来说,您不需要使用 try-catch ,除非您能够并且将安全地处理错误并生成有用的后备。由于这个原因,大多数 try-catch 块往往位于调用堆栈的底部,以便它们捕获计划外的错误,为用户优雅地处理它们,但通过调用堆栈将它们嘈杂地记录到控制台,以便开发人员调查/正确处理/解决方法。 

我认为最重要的是用户满意度。最终,该程序将由普通用户使用。用户需要继续使用该程序进行工作,不受任何干扰。


-1
投票
try

运行代码,并使用

catch

如果有任何错误并通知开发人员和/或用户存在异常,并使用

finally
通过返回来克服异常有效对象。

通过这种方式,用户还可以继续工作,开发人员也可以检查日志文件中的错误以供将来调试。 这是我个人的想法。
    

© www.soinside.com 2019 - 2024. All rights reserved.