try-catch是否意味着防止或处理错误? (在javascript中)

时间:2017-06-29 11:20:36

标签: 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 {};
  }
};
  

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

我的是:

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的数据,那么这种实现的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

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

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

要考虑的事项:

  1. 首先是catch错误:

    • 是程序流程中自然会出现的预期错误吗?
    • 你可以做些什么错误吗?
    • 如果你发现错误,你有什么计划怎么办?
  2. 是否记录错误:

    • 这个日志对任何人都有好处吗?
    • 有人会看到那个日志条目吗?
    • 是否会向任何人提供任何有助于解决问题的有用信息?
  3. 是否向用户提出错误信息:

    • 是否让用户启动了操作?
    • 用户是否期望某种形式的回应,积极或消极?
    • 用户可以做任何事情来解决问题吗?
  4. 是否返回空对象或/ null / undefined取决于函数的职责是什么。函数是否定义为始终返回对象?然后它应该来自return {} catch。或者当预期的对象不存在时,“没有”是一个有效的响应?然后也许return false

    总的来说,你的同事对我来说似乎很合理。

答案 1 :(得分:1)

在这种特殊情况下,您使用localStorage(几乎总是不可避免地意味着使用JSON.parse()),在try-catch中包装您的处理始终是最佳做法。这是因为localStorage和JSON.parse都有异常作为其错误处理的正常部分,通常可以优雅地回退到默认值或初始值。

我使用的模式如下:

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块都倾向于位于调用堆栈的底部,因此它们会捕获计划外错误,为用户优雅地处理它们,但是使用调用堆栈将它们大声地记录到控制台以供开发人员使用正确调查/处理/解决方法。

答案 2 :(得分:-1)

我认为最重要的是用户满意度。在一天结束时,普通用户使用该程序。用户需要在不中断的情况下继续使用该程序。

所以我认为最佳做法是使用try来运行代码和catch如果有任何错误并通知开发人员和/或用户存在异常,并使用{{1}通过返回有效对象来克服异常。

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