异常
撰写时间:2024-03-06
修订时间:2024-11-27
概述
异常是指发生了可能会影响应用程序正常运行的错误,而需要采取一些额外措施予以处置的一种机制。
异常的抛出
有许多种异常。我们经常遇到的一种异常是语法分析异常。例如,当我们编写下面的代码:
由于前面未声明变量b,因此,系统将抛出异常。在浏览器的终端中将以红色显示:
上面的警示内容向我们提供了几种信息。一是有未捕获的异常。二是异常的种类为ReferenceError,即引用错误。三是具体的错误信息是b is not defined
。四是抛出异常的来源为test.html文件的第24行第21列。
异常需要处理
系统抛出异常的目的,意思是说,遇到这种错误,系统无法解决。系统能做的,就是抛出异常,并立即终止程序的运行。我们修改上面的代码为:
查看终端,只有上面的异常出错信息,而第2行的代码未被执行。
因此系统将错误信息打印给我们看,就是希望我们及时处理。否则,拒绝继续运行后面的代码。
而对于上面的异常,我们只需将代码修改为:
重新刷新网页,由于没有任何错误,终端不再显示错误信息,而最后一行的代码得以执行,从而在终端中打印出Hello
的信息。
当有异常时,如果我们不及时处理,应用程序将立即终止。这就是异常的核心所在。
因此,为使应用程序正确运行,我们必须及时处理系统所抛出的异常。上面的错误是因为我们不小心而造成的,好解决,只需修改代码后重新运行,问题解决。
用户参与机制
上面,一旦有异常出错,系统就立即撂担子不干了。因为错误确实是我们自己所造成的,不改的话确实会导致程序无法运行。我改就是。改好后就能正确运行。整个流程没有任何问题。
但如果错误不是我们自己造成的,系统的这种说不干就不干的粗暴脾气则变得不可忍受了。我们可以参与异常的处理,在系统抛出异常之前,先看一下我们自己能否处理。如果能则处理。
我们可以使用try...catch
语句来捕获异常。
如果用户捕获,则系统就认为异常已经得到处理,不再终止程序。此时处理错误的责任已经转移至用户身上。我们需要判断错误类型,并予以处理。而因为错误类型较多,我们也不可能全部预料得到何时会发生何种错误,因此一种较好的机制是默认情况下重新抛出异常。这样以后若发现新异常,再单独捕获它予以处理。
异常的妙用
不要害怕异常,有时候,我们甚至主动拥抱异常。
假设,当一个/test/test.js调用了/service/service.js文件时,在/service/service.js中,我想加载其所在URL的路径下的特定文件style.css。此时如果使用代码:
则导致抛出找不到文件的异常。它实际上等同于以下代码:
即当前路径为/test而不是/service。
此时,我们可以在/service/service.js文件中人为地抛出一个异常。
unExistedFunc是一个并不存在的函数,因此/service/service.js将抛出异常。我们捕获它,并通过其sourceURL属性值,获取了我们所需要的URL:
将后面的文件名部分去掉,我们就得到了其路径:
然后就可以加载/service/style.css了: