Javascript 错误和异常
编程中存在三种类型的错误:(a) 语法错误,(b) 运行时错误,和 (c) 逻辑错误。
语法错误
语法错误,也称为解析错误,是在对源代码进行解析的时候发生的错误。
例如,以下行会导致语法错误,因为它缺少右括号。
<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 {
// Code to run
[break;]
}
catch ( e ) {
// Code to run if an exception occurs
[break;]
}
[ finally {
// Code that is always executed regardless of
// an exception occurring
}]
//-->
</script>
try 块后面必须跟任何一个 catch 块或一个 finally 块(或两者之一)。当try块中发生异常时,将异常放入e并执行catch块。可选的finally块在 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>点击下面按钮查看结果:</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>点击下面按钮查看结果:</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>点击下面按钮查看结果:</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>点击下面按钮查看结果:</p>
<form>
<input type = "button" value = "Click Me" onclick = "myFunc();" />
</form>
</body>
</html>
您可以使用字符串、整数、布尔值或对象在一个函数中引发异常,然后您可以在与上述相同的函数中捕获该异常,或者在使用try...catch块的另一个函数中捕获该异常。
onerror() 方法
onerror事件处理程序是在JavaScript中错误处理的第一个特性。
<html>
<head>
<script type = "text/javascript">
<!--
window.onerror = function () {
alert("An error occurred.");
}
//-->
</script>
</head>
<body>
<p>点击下面按钮查看结果:</p>
<form>
<input type = "button" value = "Click Me" onclick = "myFunc();" />
</form>
</body>
</html>
onerror
的事件处理程序提供了三条信息,方便我们找出错误
- 错误消息- 浏览器为给定错误显示的详细的信息
- 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>点击下面按钮查看结果:</p>
<form>
<input type = "button" value = "Click Me" onclick = "myFunc();" />
</form>
</body>
</html>
你可以以任何您认为更好的方式显示提取的信息。
你可以使用如下所示的onerror方法来显示错误消息,以防加载图像时出现任何问题。
<img src="myimage.gif" onerror="alert('加载图片时发生错误.')" />
可以将onerror与许多 HTML 标记一起使用,以在出现错误时显示适当的消息,从而提供网页的用户体验。