JavaScript 错误和异常处理
编程中有三种类型的错误:(a)语法错误,(b)运行时错误,(c)逻辑错误。
语法错误
语法错误,也称为解析错误。
在传统编程语言(c,c++等)的编译时发生,
在JavaScript的解释时发生。
例如,下面的行会导致语法错误,因为它缺少一个右括号。
window.print(;
当JavaScript中出现语法错误时,只有包含在与语法错误相同的线程中的代码受到影响,
而其他线程中的其余代码没有任何内容依赖于错误的代码,那么他们将执行。
运行时错误
运行时错误,也称为异常,发生在执行期间(在编译/解释之后)。
例如,下面一行会导致运行时错误,因为这里的语法是正确的,但是在运行时,它试图调用不存在的方法。
window.printme();
异常还会影响发生异常的线程,从而允许其他JavaScript线程继续正常执行。
逻辑错误
逻辑错误可能是最难追踪的错误类型。
这些错误不是语法或运行时错误的结果。
而是脚本的逻辑出错,导致无法得到预期的结果,就会出现这种情况。
这些错误程序是无法捕获的,因为它取决于业务需求,
只有通过业务测试才能测出来。大多数bug都属于业务类的。
try...catch...finally
语句
最新版本的JavaScript增加了异常处理能力。
JavaScript实现了 try...catch...finally
结构以及throw操作符
来处理异常。
try...catch...finally 语法
try { // 要运行的业务代码 [break;] } catch ( e ) { // 发生异常时要运行的代码 [break;] } [ finally { // 无论是否发生异常,这里的代码都会执行 }]
当try块中发生异常时,该异常被放置在e中,并执行catch块。
try...catch...finally 示例
我们试图访问一个未定义的变量,这会引发了一个异常。
function myFunc() { var a = 100; alert("变量的值是: " + b ); } myFunc();
现在使用 try…来捕获这个异常。
function myFunc() { var a = 100; try { alert("变量的值是: " + b ); } catch ( e ) { alert("错误: " + e.description ); } } myFunc();
我们可以使用finally块,它总是在try/catch之后无条件地执行。
一般用于回滚,清理资源等操作。比如try中打开了文件,在finally中关闭文件。
function myFunc() { var a = 100; try { alert("变量的值是: " + b ); } catch ( e ) { alert("错误: " + e.description ); } finally { alert("Finally块的代码总是会被执行" ); } } myFunc();
throw抛出语句
可以使用throw语句引发内置异常或自定义异常。
之后就可以捕获这些异常,并可以采取适当的操作。
JavaScript throw抛出语句示例
function myFunc() { var a = 100; var b = 0; try { if ( b == 0 ) { throw( "0不能做除数" ); } else { var c = a / b; } } catch ( e ) { console.log("错误: " + e ); } }
onerror()方法
onerror事件处理程序是帮助JavaScript进行错误处理的第一个特性。
每当页面上出现异常时,就会在窗口对象上触发错误事件。
下面的代码中,我们定义了一个不存在的myFunc1函数,从而导致错误。
<html> <head> <script type = "text/javascript"> window.onerror = function () { alert("发生了错误"); } </script> </head> <body> <form> <input type = "button" value = "Click Me" onclick = "myFunc1();" /> </form> </body> </html>
onerror事件处理程序提供了三条信息来确定错误的确切性质
错误信息-浏览器对给定错误显示的信息相同
URL-发生错误的文件
行号-在给定URL中导致错误的代码的行号
下面的示例展示了如何提取这些信息。
JavaScript onerror()方法示例
<html> <head> <script type = "text/javascript"> window.onerror = function (msg, url, line) { alert("错误信息 : " + msg ); alert("url : " + url ); alert("行号 : " + line ); } </script> </head> <body> <form> <input type = "button" value = "Click Me" onclick = "myFunc1();" /> </form> </body> </html>
我们可以将onerror与许多HTML标记一起使用,以便在出现错误时进行提示。
比如在加载图像时出现任何问题时显示错误消息。如下所示
<img src="myimage.gif" onerror="alert('图片加载出错')" />