漫漫技术人生路

C#

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
问题:
    希望在用户视图之外处理脚本错误(异常),避免浏览器向用户报告错误信息。

解决方案:
    一种quick-and-dirty(快餐式?),向后兼容的方式是:将下面的代码置于页面的<head></head>节内:
    function doNothing(){ return true; }
    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>

    每个被抛出的异常都会产生一个Error对象的实例,该对象的引用可以作为catch子句的参数,如上面代码的ex参数,catch子句中的语句可以查看该对象的属性以获得更多信息。到目前为止,在ECMAScript标准中只有两个属性得到正式认可,即message和name。一些浏览器则实现了更多的属性:
   
属性
IE的支持  NN的支持  描述
description
5
n/a
异常的描述信息
fileName n/a
抛出异常的脚本所在文件的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语句抛出一个异常。
    输出结果为:
    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块会捕获该异常,在这里进行相应的处理。
posted on 2006-10-17 08:38  javaca88  阅读(290)  评论(1编辑  收藏  举报