2017-06-29 77 views
1

最近我和同事讨论过,关于使用trycatch来通知错误或避免错误。try-catch是为了防止还是处理错误? (在javascript中)

这是我同事的做法:

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轻松修复它并返回一个默认值,但对我来说听起来不太好。


问题

那么将使用trycatchfinally如果需要的话,使我的应用程序稳定的平衡。
我们的方法有什么问题吗?
特别是,我们不能信任来自localStorage的数据,那么这个实现的最佳方法是什么?

+4

'是它会返回未定义的(可能会导致内部应用程序崩溃)':您应该记录该方法可能会返回'undefined',并且您的代码调用它应该能够处理该问题。同样,你的同事的空对象可能会导致调用代码的异常。主要是记录在错误状态下返回的内容,并让呼叫者决定要做什么。 –

+0

不,您不会使用'finally'来为错误情况返回默认值。 – Bergi

+0

@Bergi'finally'的效用是什么 – JoseAPL

回答

-1

我觉得最重要的是用户满意度。在一天结束时,该程序由普通用户使用。用户需要使用该程序继续他的工作,而不会有任何中断。

所以,我认为最好的做法是用try运行代码和catch,如果有任何错误,并通知开发者和/或用户有一个例外,并使用finally通过返回一个有效的目的是克服例外。

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

3

既然finally在两种情况下都执行,无论是否引发了某些事情,都不是返回默认值的地方。您是否需要详细记录错误也是有问题的。这一切都取决于是否预期的错误或真正的例外情况谁可以做些什么。

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

考虑采取:

  1. 是否catch错误在首位:

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

    • 该日志任何人都没好处呢?
    • 有人会看到这个日志条目吗?
    • 它会给任何人提供任何有助于解决问题的有用信息吗?
  3. 是否错误的东西用户:

    • 没有用户发起的行动?
    • 用户是否期望某种形式的响应,正面还是负面?
    • 用户可以做任何事情来解决问题吗?

是否返回一个空对象,或者什么/ null/undefined取决于函数的责任是什么。定义的函数是否总是返回一个对象?那么它应该从catchreturn {}。或者当预期的对象不存在时,“没有”是有效的回应?那么也许return false

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

+0

好吧,如果由于任何原因,在'localStorage'中有一个无效的JSON对象,我会返回一个空的对象,假设'getUserFromLocalStorage'总是会工作并返回一些(有效),这是“不正确的”?因为有错误,我理解你的解释。实际上,如果密钥不存在,我们甚至不应该返回空对象。 我想这一切都取决于'getUserFromLocalStorage'函数的合约。你怎么看? :) – JoseAPL

+1

错误并不总是致命的,这意味着在正常的程序流程中可能会出现错误,可以简单地进行默默处理(在地毯下扫描)。错误!==总是敲响警钟。除此之外,是的,*你*决定你希望你的功能在外部表现如何。 – deceze

+0

谢谢,你应得到一个伟大的解释和使用情况的赏金:) – JoseAPL

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块倾向于坐在调用堆栈的底部,以便它们捕获计划外错误,为用户正常处理它们,但将它们用调用堆栈进行威胁地记录到控制台以供开发人员使用调查/正确处理/解决方法。

相关问题