javascript - try-catch 是为了防止还是处理错误? (在javascript中)

标签 javascript web try-catch local-storage web-storage

最近我和我的同事讨论了关于使用 trycatch 来通知错误或避免它们的问题。

这是我同事的方法:

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 {};
  }
};

Wich means, he doesn't care about the given error and he is just carrying of returning an object in order to continue the process

我的是:

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 catchfinally 来平衡我的应用程序会怎样呢?
我们的方法有问题吗?
特别是,我们不能信任来自 localStorage 的数据,那么对于这个实现来说最好的方法是什么?

最佳答案

由于 finally 在任何一种情况下都会执行,无论是否抛出某些东西,它都不是返回默认值的地方。您是否需要非常详细地记录错误也是值得怀疑的。这完全取决于某事是预期错误还是真正的异常情况,以及谁可以对此采取措施。

存储的值是否很有可能是无效的 JSON?在这种情况下,您有一个“备用计划”来做什么?用户和/或开发人员对此无能为力?然后不要打扰任何人。也许您想 console.log 一条可能有助于调试的消息,但除此之外只是继续执行程序流程。如果 a) 用户没有启动操作并且 b) 他们也无能为力,那么肯定没有必要用 alert 来打扰用户。

注意事项:

  1. 是否首先捕获错误:

    • 这是程序流程中可能自然发生的预期错误吗?
    • 这是一个您可以做些什么的错误吗?
    • 如果发现错误,您有什么计划吗?
  2. 是否记录错误:

    • 这个日志对任何人有好处吗?
    • 有人会看到该日志条目吗?
    • 它是否为任何人提供了任何有助于解决问题的有用信息?
  3. 是否就某事打扰用户:

    • 用户是否发起了操作?
    • 用户是否期望某种形式的响应,正面的还是负面的?
    • 用户可以采取任何措施来解决问题吗?

是返回一个空对象还是什么都不返回/null/undefined 取决于函数的职责是什么。函数是否定义为总是返回一个对象?然后它应该从 catch返回{}。或者当预期对象不存在时,“无”是有效响应吗?然后可能返回false

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

关于javascript - try-catch 是为了防止还是处理错误? (在javascript中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44823712/

相关文章:

javascript - 路由更改时 Mithril 组件不更新

javascript - 如何使用嵌入式功能(Pete 的 One Scroll Page - peachananr)

java - 无状态 session bean 的 ejb 拦截器,如何调用有状态 session bean

web - 与 twilio 共享屏幕,无需扩展程序

linux - 是否可以直接从C程序或shell脚本向搜索引擎发送搜索参数?

sql-server - SQL Server try catch性能

javascript - 如何滚动到 jQuery 中的元素?

javascript - 错误 : PostCSS plugin tailwindcss requires PostCSS 8

c# - 无法跳出finally block

node.js - 我该如何处理服务器上的所有错误,使其永不崩溃?