• javascript中的异常处理


    问题:
        希望在用户视图之外处理脚本错误(异常),避免浏览器向用户报告错误信息。

    解决方案:
        一种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
        {
            colors[
    2= "red";
        }
        
    catch(e)
        {

            alert("An exception occured in the script.Error name: " + e.name
                
    + ".Error message: " + e.message);
        }
        要访问colors索引为2的元素,会引发一个异常:colors is not defined。catch块中的语句会告诉用户一些简单的信息。这看起来不错,可以用这种方法给用户显示一些比较友好的信息。
       
        等等,还要注意,这里的catch语句会捕捉 所有类型的异常。想想在C#中,我们需要尽量避免捕获通用的Exception类型的异常,因为它太通用了,我们有时还希望能针对不同类型的异常采取不同的应对方法。这里也是一样,幸运的是,JavaScript中也有一些特定类型的异常。比如,对于上面代码引发的异常,我们可以这么写:
        try
        {
            colors[
    2= "red";
        }
        
    catch(e)
        {
            
    if(e instanceof TypeError)
            {
                alert(
    "An exception occured in the script.Error name: " + e.name
                    
    + ".Error message: " + e.message);
            }
        }
        在捕获异常后,会进行异常类型的判断,只处理TypeError类型的异常,其他类型的则忽略。
        JavaScript中共有六种基本的异常类型:
    • EvalError   : 在错误的调用eval()函数时引发;
    • RangeError  : 在一个数字型变量的值超出了其范围时引发;
    • ReferenceError : 在使用一个无效的引用时引发;
    • SyntaxError : 在解析JavaScript代码时其中的语法错误引发;
    • TypeError   : 遇到一个意外的类型时引发;
    • URIError    :  错误地使用encodeURI()或decodeURI()函数时引发。
        下面的代码演示了嵌套的异常处理的流程:
        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语句抛出一个异常,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


        异常的信息不要让用户看到。使用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块会捕获该异常,在这里进行相应的处理。

     

    作者:Anders Cui
    出处:http://anderslly.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    【梅西加油!】梅西加油!!加油梅西!!
    [CQOI2014][bzoj3507] 通配符匹配 [字符串hash+dp]
    [NOI2011][bzoj2434] 阿狸的打字机 [AC自动机+dfs序+fail树+树状数组]
    [USACO12Jan][luogu3041] Video Game Combos [AC自动机+dp]
    [HNOI2004][bzoj1212] L语言 [Trie+dp]
    [POI2005][luogu3462] SZA-Template [fail树]
    [HNOI2008][bzoj1009] GT考试 [KMP+矩阵快速幂]
    [SDOI2008][luogu2463] Sandy的卡片 [kmp]
    [POI2006][luogu3435] OKR-Periods of Words [kmp+next数组]
    [NOI2014][bzoj3670] 动物园 [kmp+next数组应用]
  • 原文地址:https://www.cnblogs.com/anderslly/p/javascriptexception.html
Copyright © 2020-2023  润新知