`
xiaobian
  • 浏览: 588016 次
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript异常处理

阅读更多
http://blog.chinaunix.net/u/14014/showart_380273.html
http://www.pconcool.com/article.aspx?id=6144

异常处理概述
在代码的运行过程中,错误是不可避免的,总的来说,错误发生于两种情况:一是程序内部的逻辑或者语法错误,二是运行环境或者用户输入中不可预知的数据造成的错误。对于前者,就称之为错误(error),可以通过调试程序来解决;而后一种则更多的称之为异常(exception),顾名思义,就是超出常规,没有按程序设计的意愿来输入数据。当然,异常还会有许多种类型。
所以说,异常并不等价于错误,相反,有时还会利用异常来解决一些问题。JavaScript可以捕获一个异常并进行相应的处理,从而避免了浏览器向用户报错。

使用try-catch-finally处理异常
用户可以使用该结构处理可能发生异常的代码,如果发生异常,则由catch捕获并进行处理,其语法如下:
try{
//要执行的代码
}
catch(e){
//处理异常的代码
}
finally{
//无论异常发生与否,都会执行的代码
}
通过异常处理,可以避免程序停止运行,从而具有了一定的自我修复能力。
在Ajax开发中,利用异常处理的一个典型应用就是创建XMLHttpRequest对象,不同浏览器创建它的方式是不一样的,为了使代码能够跨浏览器运行,就可以利用异常,一种方法不行,再用另一种方法,直到不发生异常为止,例如:

通过这种方式,就可以跨浏览器创建XMLHttpRequest对象。注意,即使不在catch块内进行处理,catch标识及其参数e也是必须写的,否则会产生语法错误,而finnally则不是必须的。
使用throw语句抛出异常
在JavaScript中有其内部的异常机制,在遇到非法操作时能自动抛出异常。实际的开发中,随着程序的复杂,需要能自己实现异常,这可以通过throw语句来实现:
throw value;
其中value就是要抛出的异常变量,它可以是JavaScript中的任何一种类型。但在JavaScript内部的异常中,异常参数(即catch (e)中的e)是一个名为error的对象,可以通过new Error(message)来创建这个对象,异常的描述被作为error对象的一个属性message,可以由构造函数传入,也可以之后赋值。通过这个异常描述message,可以让程序获取异常的详细信息,从而自动处理。
下面的程序计算两个数据的和,如果参数不是数字,则抛出异常,代码如下:

程序中使用字母作为参数传递给sum函数,是错误的,所以函数内抛出了一个异常对象,这个对象被catch语句获取,并使用alert语句显示了其详细信息。
注意:使用new Error(message)创建异常对象只是一种默认的习惯,也是内置异常的实现方式。这不是必需的,完全可以抛出任意数据类型的异常,例如一个整数,来作为异常的描述。只要在程序中抛出异常和捕获异常能匹配即可。

Error 对象除了message属性以外,还有一些其他的属性,这些属性因浏览器而异,例如:在IE浏览器中,error对象的属性包括name、number、 description、message;而在Firefox浏览器中,error对象的属性包括message、fileName、 lineNumber、stack、name。在实际的应用中如果要实现自己的异常,这些属性只要被赋值,都是可用的,其中Firefox浏览器还会自动对stack属性赋值,用于显示异常出现的位置。






解决方案:
    一种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
6 抛出异常的脚本所在文件的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块会捕获该异常,在这里进行相应的处理。
分享到:
评论
2 楼 dearhwj 2009-06-22  
这是我整理的
javascript异常处理使用总结 http://www.daniel-journey.com/archives/63
1 楼 michaelleebj 2008-02-02  
不错!很女子!很弓虽大!

相关推荐

    javaScript异常处理文档

    javaScript异常处理文档,当遇到JavaScript等异常问题时可翻阅本文档寻找答案

    javascript 异常处理使用总结

    JavaScript中的异常处理是编程中非常重要的一个环节,它允许我们优雅地处理程序运行时可能出现的错误,避免程序因意外情况而中断。本文将详细介绍JavaScript中如何使用`try...catch...finally`语句进行异常处理以及...

    javascript异常处理实现原理详解

    JavaScript异常处理是编程中不可或缺的一部分,它允许开发者在程序遇到错误时优雅地处理问题,而不是让程序崩溃。本文将深入探讨JavaScript异常处理的实现原理,包括异常的基本概念、如何使用try...catch...finally...

    JavaScript 异常处理 详解

    总结来说,JavaScript异常处理是一门艺术,需要开发者对异步编程和错误处理机制有深刻的理解。异常处理不仅能够提升程序的健壮性,减少用户的困扰,还能帮助开发者更好地定位和修复程序中的漏洞,从而提供更加流畅和...

    javascript编程异常处理实例小结

    本文实例总结了javascript编程异常处理的方法。分享给大家供大家参考,具体如下: 前言:在前一篇《asp.net开发中常见公共捕获异常方式总结》,我们整理总结了asp.net服务端的异常处理。这一篇接着前文,简单总结并...

    浅谈JavaScript异常处理语句

    运行时的错误统称为异常,为了能在错误发生时得到一个处理的机会,JavaScript提供了异常处理语句。包含try-catch、try-catch-finally和throw. try-catch语句 try{ tryStatements } catch(exception){ ...

    JavaScript错误与异常处理

    JavaScript错误与异常处理是编程实践中不可或缺的部分,尤其是在JavaScript这样的脚本语言中,错误处理显得尤为重要。JavaScript中的错误分为两种主要类型:语法错误和运行错误。语法错误,也称为错误(Error),是...

    详解JavaScript中的异常处理方法

    JavaScript中的异常处理是编写健壮脚本的重要组成部分。在JavaScript中,主要的异常处理方法包括try...catch语句,throw语句以及finally子句的使用。异常处理机制能够在程序运行期间遇到错误时,提供一种控制错误...

    javascript中异常处理案例(推荐)

    下面将详细分析和解释给定文件中提供的JavaScript异常处理案例。 首先,JavaScript中的异常处理主要是通过`try...catch...finally`语句来实现。下面是一个基本的异常处理结构: ```javascript try { // 尝试执行...

    JavaScript 处理异常的方法

    JavaScript 处理异常的方法

    reactnative异常处理库

    React Native 异常处理库是专门为在React Native框架下开发的混合移动应用提供错误管理和调试支持的工具。React Native允许开发者使用JavaScript编写原生移动应用,但JavaScript代码的运行环境中可能会遇到各种错误...

    PrettyExceptions漂亮和更实用的异常自动捕获

    三、传统JavaScript异常处理的局限性 在JavaScript中,我们通常使用try...catch语句来捕获和处理异常。然而,原生的异常堆栈信息往往难以阅读,尤其是当错误发生在深层的调用栈中时。这给调试和问题定位带来了困难...

    javascript 基础教程

    **3.2 JavaScript异常处理** - **try...catch...finally**: 捕获并处理运行时错误。 - `try`: 尝试执行的代码块。 - `catch`: 捕获错误并执行处理代码。 - `finally`: 不管是否有异常都会执行的代码块。 - **...

Global site tag (gtag.js) - Google Analytics