chenxiaochun / blog

🖋️ChenXiaoChun's blog
179 stars 15 forks source link

js catch binding #62

Open chenxiaochun opened 5 years ago

chenxiaochun commented 5 years ago

Optional catch binding 提议目前处于 Stage 3,这篇文章就是来解释一下它是如何工作的。

概述

我们平时使用try catch时,一般都是如下姿势:

try {
    ···
} catch (error) {
    ···
}

可是当我们不需要error参数时,也并不能将其省略。因为 js 并不允许以下的语法:

try {
    ···
} catch() {
    ···
}

那么,此提议的意义就是当你不需要error参数时,可以将其省略:

try {
    ···
} catch {
    ···
}

使用场景

场景1:JSON.parse()

使用JSON.parse()时,如果传给它的是一个非预期类型值,一般它就会抛异常:

> JSON.parse('abc')
SyntaxError: Unexpected token a in JSON at position 0

针对此情况,你可以这样处理:

let jsonData;
try {
    jsonData = JSON.parse(str); // (A)
} catch {
    jsonData = DEFAULT_DATA;
}

但是,这种使用方式会引起另外一个问题。当 A 行代码报错时,它会被静默忽略,即使你可能只是一个拼写错误。这个问题也曾经困扰过我很长时间。因此,我更倾向于使用以下带有条件的抛出异常:

let jsonData;
try {
    jsonData = JSON.parse(str);
} catch (err) {
    if (err instanceof SyntaxError) {
        jsonData = DEFAULT_DATA;
    } else {
        throw err;
    }    
}

场景2:属性链

原文链接