《javascript高级程序设计》笔记(十七)

错误处理与调试

(一)浏览器报告的错误

1.IE

2.Firefox

3.Safari

4.Opera

5.Chrome

(二)错误处理

1.try-catch语句

try{
    //可能会导致错误的代码

}catch(error){
    //发生错误时怎么处理

}

发生错误后catch接收一个包含错误信息的对象,它保存着错误消息的message属性。

①finally子句

finally子句一经使用,其代码无论如何都会执行。IE7及更早版本的BUG:除非有catch子句,否则finally的代码永远不会执行。只要代码包含finally子句,无论try还是catch语句块中的return语句都会被忽略。

②错误类型

Error:基类型。

EvalError:eval函数异常时。

RangeError:数值超出范围时。

ReferenceError:找不到对象。

TypeError:变量保存着意外的类型,或者在访问不存在的方法。

URIError:使用encodeURI或decodeURI而URI格式不正确。

②合理使用try-catch

最适合处理那些我们无法控制的错误。

2.抛出错误

throw操作符,用于随时抛出自定义错误,要给它指定一个值。

遇到throw操作符时,代码会立即停止执行,仅当有try-catch语句捕获到被抛出的值时,代码才会执行。

创建自定义错误消息时最常用的错误类型是Error、RangeError、ReferenceError和TypeError。

①抛出错误的时机

在某种特定的已知错误条件,导致函数无法正常执行时抛出错误。

②抛出错误与使用try-type

捕获错误的目的在于避免浏览器以默认方式处理它们,抛出错误的目的在于提供错误发生具体原因的消息。

3.错误事件

error事件处理程序捕获创建event对象,但可以接受三个参数:错误消息、错误所在的URL和行号。

        window.onerror = function(message, url, line){
            alert(message);
            return false;  //阻止浏览器报告错误的默认行为
        };
        throw new Error("Something bad happened.");

4.处理错误的策略

5.常见的错误类型

①类型转换错误

发生在使用某个操作符,或者使用其他可能会自动转换值的数据类型的语言结构时。

使用==和!=操作符,或在if、for和while等流控制语句中使用非布尔值时。

②数据转换错误

与null进行比较只能确保相应的值不少null或undefined。

基本类型的值应该用typeof检测,而对象的值应该用instanceof来检测。

③通信错误

格式不正确的URL或发生的数据,最常见的是将数据发送给服务器之前没有用encodeURIComponent()对数据进行编码。

对于查询字符串,必须使用encodeURIComponent()方法。

6.区分致命错误和非致命错误

非致命错误:不影响用户的主要任务、只影响页面的一部分、可以修复、重复相同操作可以消除错误。

致命错误:应用程序根本无法继续运行、错误明显影响了用户的主要操作、会导致其他连带错误。

发生致命错误时应该给用户发送消息告诉他们无法继续手头的事情。

7.把错误记录到服务器

将错误写入保存服务器端错误的地方。

//从查询字符串中取得数据,然后将数据写入错误日志//参数:严重程度的数值或字符串及错误消息,使用Image对象来发送请求
function logError(sev, msg){
   var img = new Image();
   img.src = "log.php?sev=" + encodeURIComponent(sev) + "&msg=" + encodeURIComponent (msg);
}

只要是使用try-catch语句,就应该吧相应错误记录到日志中。

(三)调试技术

1.将消息记录到控制台

在浏览器可以通过代码向控制台输出消息.IE8、Firefox、Chrome和Safari来说可以通过console对象向javascript控制台写入消息。

方法:error() info() log() warn()

使用LiveConnect

2.将消息记录到当前页面

在页面开辟一小块区域显示消息。

3.抛出错误

自定义错误通常使用asert抛出,可以接受两个参数:求值结果应该为true的条件和条件为false时要抛出的错误。

替换某些函数的if语句。

        function divide(num1, num2){
            assert(typeof num1 == "number" && typeof num2 == "number",
                   "divide(): Both arguments must be numbers.");
            return num1 / num2;
        }

(四)常见的IE错误

1.操作终止

IE8之前,当<script>节点被包含在某个元素,而且javascript代码又要使用appendChild()、innerHTML或其他DOM方法修改该元素的父元素或祖先元素时,将会发生操作终止错误。

可以等到目标元素加载完毕后再对它进行操作,或者为document.body添加一个绝对定位在页面上的覆盖层。

//新的<div>元素被添加到document.body的开头而不是末尾,完成这部分的信息在脚本运行时是已知的
    <div>
        <script type="text/javascript">
            document.body.insertBefore(document.createElement("div"), document.body.firstChild);
        </script>
    </div>

也可以直接把<script>元素作为<body>的子元素。

2.无效字符

例如一个很像减号缺是有Unicode值8211表示的字符(\u2013),不能作为常规的减号。这个字符通常是在word文档自动插入的。

3.未找到成员

由于垃圾收集例程配合错误所直接导致。如果再兑现被销毁后又给该对象赋值,就会发生。最常见是使用event对象,IE的event对象有window属性,该对象在事件发生时创建,在最后一个事件处理程序执行完毕后销毁。如果再一个闭包使用了event对象,而该闭包不会立即执行,那么将来调用它并给event的属性赋值时,会导致未找到成员错误。

document.onclick = function () {
      var event = window.event;
      setTimeout(function(){
          event.returnValue = false;     //未找到成员错误
      },1000);
}

4.未知运行时错误

使用innerHTML或outerHTML以以下方式指定HTML时:把块元素插入行内元素    访问表格任意部分的任意属性

5.语法错误

6.系统无法找到指定资源

使用javascript请求某个资源URL,而该URL长度超过2083个字符时发生。

时间: 2024-12-30 00:06:01

《javascript高级程序设计》笔记(十七)的相关文章

javascript高级程序设计——笔记

javascript高级程序设计--笔记 基本概念 基本数据类型包括Undefined/Null/Boolean/Number和String 无须指定函数的返回值,实际上,未指定返回值的函数返回的是一个特殊的undefined值 变量.作用域和内存问题 基本类型值在内存中占据固定大小的空间,因此保存在栈内存中 引用类型的值是对象,保存在堆内存中 确定一个值是哪种基本类型用typeof,确定一个值是哪种引用用instanceof 所有变量都存在于一个执行环境当中,这个执行环境决定了变量的生命周期,

javascript高级程序设计笔记1

最近在看javascript高级程序设计,看之前觉得自己的js学得还不错,然后,看了没几页就觉得自己好像没有学过一样,这主要写写我以前不完全了解的一些知识. 首先是关于基本数据类型的,从Number开始,以前经常用parseInt来转换数值,看过书才知道,这个函数的本意是专门用于把字符串转换成数值,而且以前也不知道它具体是怎么一个转换规则.先来看看Number()函数的转换规则: 1.如果是Boolean 值,true 和false 将分别被转换为1 和0.2.如果是数字值,只是简单的传入和返回

javascript高级程序设计笔记(第5章 引用类型)

1.Object类型 两种方式定义:对象字面量.new 两种方式访问:括号.点 2.Array类型 2.1  定义方式:new Array.数组字面量 2.2  lenght属性:可以利用它方便的想数组末尾添加元素 2.3  检测数组 instanceof isArray()方法  2.4  toString().soLocaleString().valueOf().join()方法 2.5.栈方法   push()方法:逐个添加到数组末尾,并返回修改后的数组长度 pop()方法:返回数组的最后

【javascript高级程序设计笔记】第六章OOP

忙了一段时间,加了将近一个月的班. 书也落下没看,上次看到第七章(这部分笔记大概还是9月份的吧),偶尔看到很吃力.看的速度慢下来. 学习就是一个慢慢积累慢慢沉淀的过程.看书时没有明显觉得提升.但在看完书后近段时间工作中写代码,明显感觉效率还是有提升,基础知识牢固了. 这本书是第二次看,这次很认真的遍读和做笔记,笔记的文字均是自己边看边敲的,这样才更好的真正的吸收到一部分吧! 这些天在看web响应式设计:HTML5和CSS3实战 第6章 面向对像的程序设计 6.1.1属性类型 ECMAScript

JavaScript高级程序设计笔记之面向对象

说起面向对象,大部分程序员首先会想到 类 .通过类可以创建许多具有共同属性以及方法的实例或者说对象.但是JavaScript并没有类的概念,而且在JavaScript中几乎一切皆对象,问题来了,JavaScript中如何面向对象? JavaScript中将对象定义为:一组无序的 键值对的集合,属性以及方法的名称就是键,键的值可以是任何类型(字符串,数字,函数--) 在JavaScript中,所有对象继承自Object,所有对象继承自Object,所有对象继承自Object! 创建 1  简单创建

javascript高级程序设计笔记(第7章 函数表达式)

7.5 小结 在JavaScript 编程中,函数表达式是一种非常有用的技术.使用函数表达式可以无须对函数命名,从而实现动态编程.匿名函数,也称为拉姆达函数,是一种使用JavaScript 函数的强大方式.以下总结了函数表达式的特点.? 函数表达式不同于函数声明.函数声明要求有名字,但函数表达式不需要.没有名字的函数表达式也叫做匿名函数.? 在无法确定如何引用函数的情况下,递归函数就会变得比较复杂:? 递归函数应该始终使用arguments.callee 来递归地调用自身,不要使用函数名——函数

【javascript高级程序设计笔记】第一章与第三章

第1章 javascript简介 1.2Javascript实现 一个完整的javascript实现由下列三个不同的部分组成 核心(ECMAScript) 提供核心语言功能 文档对象模型(DOM) 提供访问和操作网页内容的方法和接口 浏览器对象模型(BOM)提供与浏览器交互的方法和接口 ECMAScript 它规定了这门语言的下列组成部分: 语法  类型  语句  关键字 保留字 操作符 对象 ECMA-262第5版,发布于2009年. 文档对象模型(DOM) Document Object M

JavaScript高级程序设计笔记

1.1 JavaScript简史 <script> async/defer可以控制js加载顺序 把js文件放在页面底部,加快页面打开速度 3 基本概念 语法 数据类型 流控制语句 理解函数 3.4 数据类型 ECMAScript中定义了六种数据类型:Underfined.Null.Boolean.Number.String.Object 使用typeof关键字来检测类型 //Boolean()转换 var bool1 = Boolean(true); var bool2 = Boolean(&

javascript高级程序设计--笔记01

概述 JavaScript的实现包含三个部分: 1  核心(ECMAScript)   提供核心语言功能 2  文档对象模型(DOM)  一套提供了访问以及操作网页内容的API 3  浏览器对象模型(BOM)  一套提供了与浏览器交互的API ECMAScript仅仅定义了这门语言的基础,如定义了:语法.类型.语句.关键字等,实际上这门语言本身不包含输入输出定义. 而现实中,ECMAScript大多借用了某些宿主环境(如web浏览器,Node,Adobe Flash)来实现丰富的功能,这些宿主环

javascript事件小结(事件处理程序方式)--javascript高级程序设计笔记

1.事件流:描述的是从页面中接收事件的顺序. 2.事件冒泡:IE的事件流叫做事件冒泡,即事件开始从具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到不具体的节点(文档). 3.事件捕获:指不太具体的节点应该更早接收到事件,而具体的节点应该是最后接收到事件. 4.DOM事件流:“DOM2级事件”规定的事件流包含三个阶段:事件捕获,处于目标阶段和事件冒泡阶段.(实际的目标元素在捕获阶段接不会收到事件) IE不支持DOM事件流,Opera.safari.chrome.firefox支持