JavaScript错误和异常处理
编程中存在三种错误:(a)语法错误,(b)运行时错误和(c)逻辑错误。
语法错误
语法错误,也称为解析错误,发生在传统编程语言的编译时和JavaScript的解释时。
例如,以下行由于缺少右括号而导致语法错误。
<script type = "text/javascript"> <!-- window.print(; //-> </script>
当JavaScript中发生语法错误时,仅会影响与该语法错误相同的线程中包含的代码,并且假设其他线程中的其余代码均不依赖于包含该错误的代码,则其他线程中的其余代码将被执行。
运行时错误
运行时错误,也称为异常在执行期间(在编译/解释之后)发生。
例如,以下行会导致运行时错误,因为此处语法正确,但是在运行时,它正在尝试调用不存在的方法。
<script type = "text/javascript"> <!-- window.printme(); //-> </script>
异常还会影响发生它们的线程,从而允许其他JavaScript线程继续正常执行。
逻辑错误
逻辑错误可能是最难追踪的错误类型。这些错误不是语法或运行时错误的结果。相反,当你在驱动脚本的逻辑中犯了一个错误而没有得到预期的结果时,它们就会发生。
你无法捕获这些错误,因为这取决于你的业务需求,你希望在程序中放入哪种类型的逻辑。
try ... catch ... finally语句
最新版本的JavaScript增加了异常处理功能。JavaScript实现了try...catch...finally结构以及throw操作符来处理异常。
你可以捕捉程序员产生的和运行时的异常,但你不能捕捉JavaScript的语法错误。
下面是try...catch...finally块的语法:
<script type = "text/javascript"> <!-- try { //要运行的代码 [break;] } catch ( e ) { //发生异常时运行的代码 [break;] } [ finally { //始终执行的代码,无论 //发生异常 }] //-> </script>
try块后面必须有一个catch块或者一个finally块(或者两者之一)。当一个异常在try块中发生时,该异常被放在e中,然后执行catch块。可选的final块在try/catch之后无条件地执行。
例子
这是一个示例,其中我们试图调用一个不存在的函数,而这又引发了一个异常。让我们看看它的表现如何try...catch:
<html> <head> <script type = "text/javascript"> <!-- function myFunc() { var a = 100; alert("Value of variable a is : " + a ); } //-> </script> </head> <body> <p>Click the following to see the result:</p> <form> <input type = "button" value = "Click Me" onclick = "myFunc();" /> </form> </body> </html>
现在让我们尝试使用try...catch并显示一条用户友好的消息。如果要向用户隐藏此错误,也可以禁止显示此消息。
<html> <head> <script type = "text/javascript"> <!-- function myFunc() { var a = 100; try { alert("Value of variable a is : " + a ); } catch ( e ) { alert("Error: " + e.description ); } } //-> </script> </head> <body> <p>Click the following to see the result:</p> <form> <input type = "button" value = "Click Me" onclick = "myFunc();" /> </form> </body> </html>
你可以使用finally在try / catch之后将始终无条件执行的代码块。这是一个例子。
<html> <head> <script type = "text/javascript"> <!-- function myFunc() { var a = 100; try { alert("Value of variable a is : " + a ); } catch ( e ) { alert("Error: " + e.description ); } finally { alert("Finally block will always execute!" ); } } //-> </script> </head> <body> <p>Click the following to see the result:</p> <form> <input type = "button" value = "Click Me" onclick = "myFunc();" /> </form> </body> </html>
抛出异常
你可以使用throw引发内部异常或自定义异常的语句。以后可以捕获这些异常,你可以采取适当的措施。
以下示例演示了如何使用throw语句。
<html> <head> <script type = "text/javascript"> <!-- function myFunc() { var a = 100; var b = 0; try { if ( b == 0 ) { throw( "Divide by zero error." ); } else { var c = a / b; } } catch ( e ) { alert("Error: " + e ); } } //-> </script> </head> <body> <p>Click the following to see the result:</p> <form> <input type = "button" value = "Click Me" onclick = "myFunc();" /> </form> </body> </html>
你可以使用字符串,整数,布尔值或对象在一个函数中引发异常,然后可以使用与上述相同的函数或使用试着抓block.
onerror()方法
onerror事件处理程序是促进JavaScript中错误处理的第一个功能。这error只要页面上发生异常,就会在窗口对象上触发事件。
<html> <head> <script type = "text/javascript"> <!-- window.onerror = function () { alert("An error occurred."); } //-> </script> </head> <body> <p>Click the following to see the result:</p> <form> <input type = "button" value = "Click Me" onclick = "myFunc();" /> </form> </body> </html>
onerror事件处理程序提供三条信息,以识别错误的确切性质:
错误信息:对于给定的错误,浏览器将显示相同的消息;
URL:发生错误的文件;
行号:给定URL中导致错误的行号。
这是显示如何提取此信息的示例。
<html> <head> <script type = "text/javascript"> <!-- window.onerror = function (msg, url, line) { alert("Message : " + msg ); alert("url : " + url ); alert("Line number : " + line ); } //-> </script> </head> <body> <p>Click the following to see the result:</p> <form> <input type = "button" value = "Click Me" onclick = "myFunc();" /> </form> </body> </html>
你可以以你认为更好的任何方式显示提取的信息。
你可以使用onerror方法,如下所示,以在加载图像时出现任何问题时显示错误消息。
<img src="myimage.gif" onerror="alert('An error occurred loading the image.')" />
你可以使用onerror带有许多HTML标签,以在发生错误时显示适当的消息。