问题:
希望在用户视图之外处理脚本错误(异常),避免浏览器向用户报告错误信息。
解决方案:
一种quick-and-dirty(快餐式?),向后兼容的方式是:将下面的代码置于页面的<head></head>节内:
在IE5和Netscape6及它们的后续版本中,你可以使用更多的错误(异常)处理方式。为防止早期的浏览器执行这些特殊的脚本时失败,将这些语句所在的<script>标签的language属性设置为JavaScript1.5(language="JavaScript1.5")。
将可能导致或抛出异常的语句封装在一个try...catch...finally结构中。先执行try块中的语句,其中包含可能发生异常的代码,如果发生异常,则执行catch块中的代码,而不管是否发生异常,最后会无条件执行finally块的语句:
每个被抛出的异常都会产生一个Error对象的实例,该对象的引用可以作为catch子句的参数,如上面代码的ex参数,catch子句中的语句可以查看该对象的属性以获得更多信息。到目前为止,在ECMAScript标准中只有两个属性得到正式认可,即message和name。一些浏览器则实现了更多的属性:
下面的代码演示了异常处理的流程:
输出结果为:
异常的信息不要让用户看到。使用description或message属性来决定如何处理异常。
也可以在脚本中有意识地抛出异常建立自己的异常处理机制。看下面的示例:
希望在用户视图之外处理脚本错误(异常),避免浏览器向用户报告错误信息。
解决方案:
一种quick-and-dirty(快餐式?),向后兼容的方式是:将下面的代码置于页面的<head></head>节内:
function doNothing(){ return true; }
window.onerror = doNothing;
这样不会阻止编译期的脚本错误(例如页面加载时解释器发现的语法错误),也不会向你透露代码的何处潜伏着错误。所以只有你的代码经过了充分的测试后才使用这种方法,在测试的时候,要把这些代码去掉。window.onerror = doNothing;
在IE5和Netscape6及它们的后续版本中,你可以使用更多的错误(异常)处理方式。为防止早期的浏览器执行这些特殊的脚本时失败,将这些语句所在的<script>标签的language属性设置为JavaScript1.5(language="JavaScript1.5")。
将可能导致或抛出异常的语句封装在一个try...catch...finally结构中。先执行try块中的语句,其中包含可能发生异常的代码,如果发生异常,则执行catch块中的代码,而不管是否发生异常,最后会无条件执行finally块的语句:
<script language="javascript1.5">
try
{
//tryStatements
}
catch(ex)
{
//catchStatements;
}
finally
{
//finallyStatements;
}
</script>
try
{
//tryStatements
}
catch(ex)
{
//catchStatements;
}
finally
{
//finallyStatements;
}
</script>
每个被抛出的异常都会产生一个Error对象的实例,该对象的引用可以作为catch子句的参数,如上面代码的ex参数,catch子句中的语句可以查看该对象的属性以获得更多信息。到目前为止,在ECMAScript标准中只有两个属性得到正式认可,即message和name。一些浏览器则实现了更多的属性:
属性 |
IE的支持 | NN的支持 | 描述 |
description |
5 |
n/a |
异常的描述信息 |
fileName | n/a |
6 | 抛出异常的脚本所在文件的URI |
lineNumber |
n/a |
6 |
抛出异常的代码的行号 |
message |
5.5 |
6 |
异常的描述信息(ECMA) |
name |
5.5 |
6 |
异常类型(ECMA) |
number |
5 |
n/a |
IE独有的异常代号 |
下面的代码演示了异常处理的流程:
try
{
print("Outer try running..");
try
{
print("Nested try running...");
throw "an error";
}
catch(e)
{
print("Nested catch caught " + e);
throw e + " re-thrown";
}
finally
{
print("Nested finally is running...");
}
}
catch(ex)
{
print("Outer catch caught " + ex);
}
finally
{
print("Outer finally running");
}
function print(s)
{
document.write(s);
}
这里使用throw语句抛出一个异常。{
print("Outer try running..");
try
{
print("Nested try running...");
throw "an error";
}
catch(e)
{
print("Nested catch caught " + e);
throw e + " re-thrown";
}
finally
{
print("Nested finally is running...");
}
}
catch(ex)
{
print("Outer catch caught " + ex);
}
finally
{
print("Outer finally running");
}
function print(s)
{
document.write(s);
}
输出结果为:
Outer try running..
Nested try running...
Nested catch caught an error
Nested finally is running...
Outer catch caught an error re-thrown
Outer finally running
异常的信息不要让用户看到。使用description或message属性来决定如何处理异常。
也可以在脚本中有意识地抛出异常建立自己的异常处理机制。看下面的示例:
function processNumber(inputField)
{
try
{
var inpVal = parseInt(inputField.value, 10);
if(isNaN(inpVal))
{
var msg = "Please enter a number!";
var err = new Error(msg);
if(!err.message)
{
err.message = msg;
}
throw err;
}
}
catch(e)
{
alert(e.message);
inputField.focus();
inputField.select();
}
}
在try块中检测表单域的值,如果不合要求,则抛出自定义异常,catch块会捕获该异常,在这里进行相应的处理。{
try
{
var inpVal = parseInt(inputField.value, 10);
if(isNaN(inpVal))
{
var msg = "Please enter a number!";
var err = new Error(msg);
if(!err.message)
{
err.message = msg;
}
throw err;
}
}
catch(e)
{
alert(e.message);
inputField.focus();
inputField.select();
}
}