我应该如何处理JavaScript中对象构造函数的无效输入

时间:2012-10-04 16:00:30

标签: javascript oop class exception throw

我正试着用Javascript来解决OOP问题(我从来没有真正使用任何其他语言的OOP,所以这是我第一次体验它)。我编写了一个需要构造函数输入的类,但构造函数只能使用特定格式的字符串。

我有一个正则表达式,我可以用来检查输入,但我不知道如果它不匹配我应该做什么(或者根本没有输入)。我应该抛出某种异常吗?如果是这样,我该怎么做呢?

4 个答案:

答案 0 :(得分:4)

在JavaScript中,抛出异常不是您想要做的。异常只能异常发生(呃...)。这与Java形成对比,在Java中,异常遍布整个地方进行通信。造成这种差异的原因是JS中的异常处理速度非常慢。

所以你可以很好地为你的构造函数装备throw,但是不应该在生产中捕获它。您最好先在构造函数之外检查有效性。

执行:

if (validRE.test(input)) {
    foo = new MyObject(input);
} else {
    // show message to the user
}

不要:

try {
    foo = new MyObject(input);
} catch (ex) {
    // show message to the user
}

答案 1 :(得分:2)

JavaScript构造函数(使用new keyword调用的函数)总是需要返回一个对象,你不能返回falsenull或类似于调用普通时的类似。所以,你有两个选择:

  • 从中抛出异常。您可以使用throw statement中的每个javascript值执行此操作。然后,使用try statement
  • 在建筑外捕捉它们
  • 返回一个常规对象,但内部值设置为invalid指针。例如,Date构造函数会执行此操作,然后获取属性会生成NaN s。

此外(特别是在使用异常时),您可能会在构造函数上提供额外的验证函数(返回布尔值)作为静态属性,因此您甚至可以在构造对象之前使用它。例如:

function Decryption(str) {
    if (! Decryption.test(str))
        throw new SyntaxError("invalid encryption");
    this.result = decrypt(str);
}
Decryption.test = function(str) {
    return /MyCoolRegExp/.test(str);
};

答案 2 :(得分:1)

如果你想抛出异常,你可以这样做:

throw new Error("Illegal construction string.");

Error对象不是强制性的,即你可以抛出一个纯字符串,但如果你处理onerror事件,它会使错误信息显示出来。)

当您打算使用用户输入时,您可能在调用构造函数之前验证字符串,并为用户提供比异常结果更友好的消息。你当然可以在构造函数中进行验证,以确保没有任何东西偷偷摸摸。

答案 3 :(得分:0)

通常有两种方法可以解决这个问题:抛出异常,或返回一些表示失败的值(如undefined)。在JavaScript中,我倾向于更倾向于后者,更宽容的方法。

我还发现第二种方法更接近于模仿很多JavaScript本身。例如,在Python中,如果您尝试访问对象上不存在的属性,它将抛出异常。

>>> foo = 0
>>> foo.idontexist
AttributeError: 'int' object has no attribute 'idontexist'

而在JavaScript中,它只返回undefined

> var foo = 0;
> foo.idontexist
undefined

许多功能和对象也以这种方式工作。例如,Date在传递错误的日期字符串时返回Invalid Date对象,而不是抛出异常。

> var foo = new Date('thisisnotadate');
> foo
Invalid Date