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

时间:2010-05-13 08:50:04

标签: javascript exception

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

3 个答案:

答案 0 :(得分:11)

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

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

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

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

  

是否有内置异常类型(如NullPointerException)?

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

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

答案 1 :(得分:4)

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

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

根据我自己的经验,try / catch块有点罕见,感觉真的很特别,而不像Java那样不可避免。

答案 2 :(得分:3)

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

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的子类。