javascript中的异常处理

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块会捕获该异常,在这里进行相应的处理。

时间: 2024-11-17 23:49:58

javascript中的异常处理的相关文章

JavaScript中的异常处理方法介绍

 这篇文章主要介绍了详解JavaScript中的异常处理方法,包括基本的try...catch语句和throw语句的使用,需要的朋友可以参考下     有三种类型的编程错误:(1)语法错误和(2)运行时错误(3)逻辑错误: 语法错误: 语法错误,也被称为解析错误,在编译时进行传统的编程语言,并出现在JavaScript解释时. 例如,下面一行将导致一个语法错误,因为它缺少一个右括号: ? 1 2 3 4 5 <script type="text/javascript"> &

详解JavaScript中的异常处理方法_基础知识

 有三种类型的编程错误:(1)语法错误和(2)运行时错误(3)逻辑错误:语法错误: 语法错误,也被称为解析错误,在编译时进行传统的编程语言,并出现在JavaScript解释时. 例如,下面一行将导致一个语法错误,因为它缺少一个右括号: <script type="text/javascript"> <!-- window.print(; //--> </script> 当一个语法错误在JavaScript中出现,只有在同一个线程中包含的语法错误的影响

JavaScript中的try...catch和异常处理(转)

在JavaScript可以使用try...catch来进行异常处理.例如:   1 try 2 { 3 foo.bar(); 4 } catch (e) 5 { 6 alert(e.name + ": " + e.message); 7 }   目前我们可能得到的系统异常主要包含以下6种:  EvalError: raised when an error occurs executing code in eval() RangeError: raised when a numeric

JS中的异常处理方法分享

我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要不用户体验不好)    代码如下: window.onerror=function(){return true;}        下面是为了获取js异常信息,方便开发者找回问题   1,try...catch...   代码如下: <script type="text/javascript&q

JavaScript中错误正确处理方式,你用对了吗?

JavaScript的事件驱动范式增添了丰富的语言,也是让使用JavaScript编程变得更加多样化.如果将浏览器设想为JavaScript的事件驱动工具,那么当错误发生时,某个事件就会被抛出.理论上可以认为这些发生的错误只是JavaScript中的简单事件. 本文将会讨论客户端JavaScript中的错误处理.主要介绍JavaScript中的易犯错误.错误处理.异步代码编写等内容. 下面就让我们一起看看如何正确处理JavaScript中的错误. Demo演示 本文中使用的demo可以在GitH

深入探讨javascript中的数据类型_基础知识

学一门编程语言,无非两方面:一是语法,二是数据类型.类C语言的语法不外乎if.while.for.函数.算术运算等,面向对象的语言再加上object. 语法只是语言设计者预先做的一套规则,不同语言语法不尽相同,但都有一些共通点,对于熟悉一两门编程语言的人,学其他的编程语言时,语法往往不是问题(当然,如果你一直学的是类C语言,那么首次接触lisp时肯定也要花些时间),学习的重点往往是数据类型及其相关操作上,不是有句老话:"数据结构+算法=程序"!其次,有些语言的语法本身就存在设计问题(j

深入理解JavaScript中的并行处理_javascript技巧

前言 为什么说多线程如此重要?这是个值得思考的问题.一直以来,派生线程以一种优雅的方式实现了对同一个进程中任务的划分.操作系统负责分配每个线程的时间片,具有高优先级并且任务繁重的线程将分配到更多的时间片,而低优先级空闲的线程只能分到较少的时间片. 虽然多线程如此重要,但JavaScript却并没有多线程的能力.幸运的是,随着 Web Worker 的普及,我们终于可以在后台线程来处理资源密集型的计算了.而不好的方面是,目前制定的标准只适用于当前的生态系统,这有时候就比较尴尬了.如果你了解其他从一

JavaScript中的面向对象介绍_js面向对象

对象 创建 对象 构造函数 公有.私有.特权.静态成员 this.call和apply 异常处理 继承 原型 对象 在JavaScript,可以说everything is object,那么什么是对象?对象就是包含一组变量和函数的集合.在其它面向对象语言中对象是由类的实例化而来,JavaScript是基于原型的面向对象语言,没有类的概念,对象派生自现有对象的副本.JavaScript中对象可以分为两类:Function和Object. 创建对象 为了提高效率,JavaScript自带内置对象,

js中的异常处理try...catch使用介绍_javascript技巧

在JavaScript可以使用try...catch来进行异常处理.例如: 复制代码 代码如下: try { foo.bar();} catch (e) { alert(e.name + ": " + e.message);} 目前我们可能得到的系统异常主要包含以下6种: EvalError: raised when an error occurs executing code in eval() RangeError: raised when a numeric variable o