抛出JavaScript异常的标准做法是什么?

What are the standard practices for throwing JavaScript Exceptions?

w3schools说异常可以是字符串,整数,布尔值或对象,但是给出的例子并没有让我觉得好,因为异常类型检查是通过字符串比较完成的。 这是JavaScript中首选的异常处理方法吗? 是否有内置的异常类型(如NullPointerException)? (如果是这样,他们是什么,他们使用什么样的继承,他们比其他选择更受欢迎?)


例外可以是你喜欢的任何事情。

在其他语言中,异常应该是实例,然后catch语句选择要捕获的异常以及实例的类通过哪些异常。

但是,JavaScript没有此功能。您只能捕获所有异常,然后查看该值以决定如何处理它。如果您不想处理异常,则必须手动重新抛出捕获的值。 (这不可避免地使catch语句变得混乱。)

您可以决定将异常实现为对象,并将它们与instanceof进行比较。或者您可以使用唯一的不透明值进行比较。或者,如果你真的想要,你甚至可以扔直线或数字。

Are there built-in exception types (like NullPointerException)?

的种类。 ECMAScript定义了一些标准错误类:Error及其子类型EvalErrorRangeErrorReferenceErrorSyntaxErrorTypeErrorURIError。但是存在浏览器实现问题,例如try { nonexistentvar; }在IE下而不是ReferenceError下给出TypeError。还有许多其他特定于浏览器的异常,特别是在处理DOM时。

直接使用这些对象并不常见,并且尝试将它们子类化是混乱的(因为JavaScript没有这样的类系统)。您可能会倾向于坚持使用您自己定义的异常来代替您自己的应用程序。例外并不是JavaScript中广泛使用的。


ECMA-262规范的第15.11节定义了几种Error类型,"当发生运行时错误时,它们被抛出为异常...... [它们]也可以作为用户定义的异常类的基础对象。"该规范还定义了其他六种错误类型,它们是语言的一部分。

抛出这些类型的异常(或从它们派生的类型)似乎更可取,因为它更容易确定它们的类型;他们还有一个内置的消息属性。

根据我自己的经验,try / catch块有点罕见,感觉非常特殊,而不像Java中那样是不可避免的。


您可以尝试Dean Edwards的基础项目。它在javascript中模拟类继承,因此使用它可以使您子类化Error类型。您无法在javascript中捕获不同类型的错误(因为它不是强类型语言),但您可以确定抛出的错误类型,并为该特定类型添加逻辑,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
try {

  // do something

} catch (e) {

  if (e instanceof NullPointerError) {

    // handle nullpointer exception

  } else if (e instanceof RuntimeError) {

    // handle runtime exception

  } else {

    // regular exception

  }
}

当然在这段代码中我假设你已经将NullPointerError和RuntimeError类声明为Error的子类。