错误处理

ES3引入了try-catch和throw语句以及一些错误类型,让开发人员能够适当的处理错误。
2008年以来,大多数web浏览器都已经具备了一些调试JavaScript代码的能力。

  1. try{
  2. // 可能会导致错误的代码
  3. } catch(error){
  4. // 在错误发生时怎么处理
  5. }

如果try块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行catch块。此时,catch块会接收到一个包含错误信息的对象。这个对象中包含的实际信息会因浏览器而异,但共同的是有一个保存着错误消息的message属性。ECMA-262还规定了一个保存错误类型的name属性;当前所有浏览器都支持这两个属性。
错误处理与调试 - 图1

4 finally子句

finally子句一经使用,其代码无论如何都会执行。
try语句块中的代码全部正常执行,finally子句会执行;如果因为出错而执行了catch语句块,finally子句照样还会执行。只要代码中包含finally子句,则无论try或catch语句块中包含什么代码——甚至return语句,都不会阻止finally子句的执行。
错误处理与调试 - 图2
如果提供了finally子句,则catch子句就成了可选的(catch或finally有一个即可)
错误处理与调试 - 图3

5 错误类型

每种错误都有对应的错误类型,而当错误发生时,就会抛出相应类型的错误对象。
定义了7中错误类型:

  • Error

Error是基类型,其它错误类型都继承自该类型。Error类型的错误很少见,如果有也是浏览器抛出的;这个基类型的主要目的是供开发人员抛出自定义错误。

  • EvalError

会在使用eval()函数发生异常时抛出。简单的说,如果没有把eval()当成函数调用,就会抛出错误。

  • RangeError

会在数值超出相应范围时触发。例如:在定义数组时,如果指定了数组不支持的项数,就会触发这种错误。

  • ReferenceError

在找不到对象的情况下,会发生ReferenceError(这种情况下,会直接导致“object expected”浏览器错误)。通常,在范围不存在的变量时,就会发生这种错误。

  • SyntaxError

当我们把语法错误的JavaScript字符串传入eval()函数时,就会导致此类型错误。
如果语法错误的代码出现在eval()函数之外,则不太可能使用SyntaxError,因为此时的语法错误会导致JavaScript代码立即停止执行。

  • TypeError

TypeError类型在JavaScript中会经常用到,在变量中保存着意外的类型时,或者在访问不存在的方法时,都会导致这种错误。错误的原因虽然多种多样,但归根结底还是由于在执行特定于类型的操作时,变量的类型并不符合要求所致。

  • URIError

在使用encodeURI()或decodeURI(),而URI格式不正确时,就会导致URIError错误。这种错误也很少见,因为前面说的这两个函数的容错性非常高。

利用不同的类型错误,可以获悉更多有关异常的信息,从而有助于对错误作出恰当的处理。要想知道错误的类型,可以像下面这样在try-catch语句的catch语句中使用instanceof操作符。
错误处理与调试 - 图4

6 合理使用try-catch

当try-catch语句中发生错误时,浏览器会认为错误已经被处理了,因而不会通过本章前面讨论的机制记录或报告错误。对于那些不要求用户懂技术,也不需要用户理解错误的Web应用程序,这应该说是个理想的结果。不过,try-catch能够让我妈实现自己的错误处理机制。
使用try-catch最适合处理那些我妈无法控制的错误。假设你在使用一个大型JavaScript库中的函数,该函数可能会有意无意的抛出一些错误。由于我们不能修改这个库的源代码,所以大可将对该函数的调用放在try-catch语句当中,万一有什么错误发生,也好恰当地处理他们。
在明明白白地知道自己的代码会发生错误时,再使用try-catch语句就不太合适了。例如,如果传递给函数的参数是字符串而非数值,就会造成函数出错,那么就应该检查参数的类型,然后再决定如何去做。在这种情况下,不应该使用try-catch语句。

7 抛出错误

错误处理与调试 - 图5
错误处理与调试 - 图6
错误处理与调试 - 图7

8 抛出错误的时机

错误处理与调试 - 图8
错误处理与调试 - 图9
错误处理与调试 - 图10
错误处理与调试 - 图11

9 抛出错误与使用try-catch

错误处理与调试 - 图12

10 错误事件

错误处理与调试 - 图13
错误处理与调试 - 图14
错误处理与调试 - 图15
错误处理与调试 - 图16

11 处理错误的策略

错误处理与调试 - 图17

12 常见的错误类型

错误处理与调试 - 图18

13 类型转换错误

错误处理与调试 - 图19

14 数据类型错误

错误处理与调试 - 图20

15 通信错误

错误处理与调试 - 图21
错误处理与调试 - 图22

16 区分致命错误和非致命错误

错误处理与调试 - 图23
错误处理与调试 - 图24
错误处理与调试 - 图25
错误处理与调试 - 图26

错误处理与调试 - 图27

17 把错误记录到服务器

错误处理与调试 - 图28
错误处理与调试 - 图29
错误处理与调试 - 图30
错误处理与调试 - 图31

18 调试技术

19 将错误记录到控制台

错误处理与调试 - 图32
错误处理与调试 - 图33

20 将消息记录到当前页面

错误处理与调试 - 图34
错误处理与调试 - 图35

21 抛出错误

错误处理与调试 - 图36
错误处理与调试 - 图37

22 小结

错误处理与调试 - 图38