在JavaScript类中抛出错误被认为是一种不好的做法吗?

3
我有一个类似下面的JavaScript类,我需要控制输入变量的数据类型。
class Store
{
    constructor (name)
    {
        if (typeof name !== "string")
            throw new Error("The first argument must be a string!");

        createStore(name);
    }

    // [...]
}

这被视为一种不良实践吗?有更好的解决方案吗?

为什么这不是一个好的实践?快速失败是好的。 - Andrew Li
这取决于您对此“存储”(Store)的意图。您是否希望为类型检查器中断整个控制流程?在我看来,将错误返回并让用户决定如何处理可能是有意义的。 - Bobby Matson
另外,您可以了解一下 Flow。这是一个库,它在函数参数中强制实施静态类型: https://flow.org/ - Bobby Matson
1
@BobbyMatson - 你不能轻易地从构造函数中返回错误,因为构造函数返回对象。你可以返回null并要求所有代码检查它,但异常在这种情况下几乎是理想的。异常也往往比仅返回错误代码更容易被开发人员注意到。99%的情况下,这种类型的错误是编程错误,而不是运行时错误,因此您希望错误立即出现在开发人员面前,以便他们可以修复代码。 - jfriend00
同意!我完全错过了这是在构造函数中 - 这完全合理。作为开发人员,我期望 new Store(123) 抛出错误。 - Bobby Matson
1个回答

1

在某些情况下,不抛出错误可能会更好。比如说,如果你有一个返回 Promise 的方法,在这种情况下,最好是拒绝它,这样可以使用 .catch 来捕获它。

class Example {
    test(name) {
        return new Promise( (resolve, reject) => {
            if (typeof name !== "string")
                reject("The first argument must be a string!")
            else
                resolve()
        })
    }
}

let ex = new Example()
ex.test(['array']).then( () => {
    console.log('We successfully passed a string!')
}).catch( err => {
    console.error(err)
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接