错误处理与调试

一、错误处理

1.try-catch语句:

ECMA-262第3版引入了try-catch语句,作为javascript中处理异常的一种标准方式。基本的语法如下:

try {

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

} catch(error){

//在错误发生时怎么处理

}

也就是说,我们应该把所有可能会抛出错误的代码放在try语句块中,而把那些用于错误处理的代码放在catch块中。例如:

try {

window.someNonexistentFunction( ) ;

} catch (error) {

alert( “ An error happened! ” ) ;

}

如果try块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着catch块。此时,catch块会接收到一个包含错误信息的对象。

(1)finally子句

虽然在try-catch语句中是可选的,但finally子句一经使用,其代码无论如何都会执行。换句话说,try语句块中的代码全部正常执行,finally子句会执行;如果因为出错而执行了catch语句块,finally子句照样还会执行。只要代码中包含finally子句,则无论try或catch语句块中包含什么代码——甚至return语句,都不会阻止finally子句的执行。来看下面的函数:

function  testFinally( ) {

try {

return 2;

} catch (error) {

return 1 ;

} finally {

return 0 ;

}

}

(2)错误类型

执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型,而当错误发生时,就会抛出相应类型的错误对象。

Error

EvalError              (在使用eval()函数发生异常时被抛出)

RangeError     (类型的错误会在数值超出相应范围时触发)

ReferenceError  (找不到对象的情况下)

SyntaxError     (把语法错误的javascript字符串传入eval()函数时,就会导致错误)

TypeError      (在变量中保存着意外的类型或者访问不存在的方法时会导致错误)

URIError            (使用encodeURI()或decodeURI(),而URI格式不正确时)

其中,Error是基类型,其他错误类型都继承自该类型。

(3)合理使用try-catch

使用try-catch最适合处理那些我们无法控制的错误。在明明白白地知道自己的代码会发生错误时,再使用try-catch语句就不太合适了。

2.抛出错误

与try-catch语句相匹配的还有一个throw操作符,用于随时抛出自定义错误。抛出错误时,必须要给throw操作符指定一个值,这个值是什么类型,没有要求。以下代码都是有效的:

throw  123456 ;

throw  “Hello world!” ;

throw  true ;

throw  { name :“javascript”} ;

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

通过使用某种内置错误类型,可以更真实的模拟浏览器错误。每种错误类型的构造函数接收一个参数,即实际的错误消息。下面是一个例子:

throw  new  Error(“Something  bad  happened.”);

3.错误事件

任何没有通过try-catch处理的错误都会触发window对象的error事件。onerror事件处理程序不会创建event对象,但是它可以接收三个参数:错误消息、错误所在的URL和行号。

4.常见的错误类型

(1)类型转换错误

类型转换错误发生在使用某个操作符,或者使用其他可能会自动转换值的数据类型的语言结构时。在使用相等(==)和不相等(!=)操作符,或者在if、for及while等流控制语句中使用非布尔值时,最常发生类型转换错误。多数情况下,建议使用全等(===)和不全等(!==)操作符,避免类型转换错误。

(2)数据类型错误

为了保证不会发生数据类型错误,只依靠开发人员编写适当的数据类型检测代码。在预料之外的值传递给函数的情况下,最容易发生数据类型错误。

(3)通信错误

第一种通信错误与格式不正确的URL或发送的数据有关。最常见的问题是在将数据发送给服务器之前,没有使用encodeRUIComponent( )对数据进行编码。另外,服务器响应的数据不正确时,也会发生通信错误。

5.区别致命错误和非致命错误

任何错误处理策略中最重要的一个部分,就是确定错误是否致命。对于非致命错误,可以根据下列一个或多个条件来确定:

不影响用户的主要任务

只影响页面的一部分

可以恢复

重复相同操作可以消除错误

致命错误,可以通过下列一个或多个条件来确定:

应用程序根本无法继续进行

错误明显影响到了用户的主要操作

会导致其他连带错误

区别非致命错误和致命错误的主要依据,就是看它们对用户的影响。

6.把错误记录到服务器

开发web应用程序过程中的一种常见做法就是集中保存错误日志,以便查找重要错误的原因。

二、调试技术

1.将消息记录到控制台

可以通过控制台对象向javascript控制台中写入消息。这个对象具有以下方法:

error:将错误记录到控制台

info:将信息性消息记录到控制台

log:将一半消息记录到控制台

warn:将警告消息记录到控制台

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

另一种输出调试消息的方式,就是在页面中开辟一个小区域,用以显示消息。例如,可以将log()函数修改为如下所示:

function  log( message ) {

var  console = document.getElementById ( “debuginfo” ) ;

if ( console === null ) {

console = document.createElement( “div” ) ;

console.id = “debuginfo” ;

console.style.background = “#dedede” ;

console.style.border = “1px solid silver” ;

console.style.padding = “5px” ;

console.style.width = “400px” ;

console.style.position = “absolute” ;

console.style.right = “0px” ;

console.style.top = “0px” ;

console.style.appendChild( console ) ;

}

console.innerHTML += “<p>” + message + “</p>” ;

}

这个修改后的log()函数首先检测是否已经存在调试元素,如果没有则会创建一个新的<div>元素,并为该元素创建一些样式,以便与页面中的其他元素区别开。然后,又使用了innerHTML,将消息写入到这个<div>元素中。结果就是页面中会有一小块区域显示错误消息。

3.抛出错误

自定义的错误通常都使用assert()函数抛出。这个函数接受两个参数,一个是求值结果应该为true的条件,另一个是条件为false时要抛出的错误。

三、常见的IE错误

(1)操作终止

(2)无效字符

(3)未找到成员

(4)未知运行时错误

(5)语法错误

(6)系统无法找到指定资源

JavaScript高级程序设计:第十七章的更多相关文章

  1. 《JavaScript高级程序设计》——第二章在HTML使用JavaScript

    这章讲的是JavaScript在HTML中的使用,也就是<script>元素的属性.书中详细讲了async.defer.src和type四个<script>的属性. 下面是对第 ...

  2. JavaScript 高级程序设计 第5章引用类型 笔记

    第五章 引用类型 一.object类型 1.创建方法: 1.使用new 操作符创建 var person=new object() Person.name=”Nicholasa” Porson.age ...

  3. JavaScript高级程序设计第20章JSON 笔记 (学习笔记)

    第二十章 JSON 1.Json 可以表示三种类型的值: 1.简单值: 表示数值:5  表示字符串:“hello wrold”注表示字符串时必须使用双引号 2.对象: {“name”:“mi”,”ag ...

  4. JavaScript高级程序设计第14章表单脚本 (学习笔记)

    第十四章 表单脚本 1.阻止默认表单提交 1.提交表单数据 1.使用type=submit提交按钮 2.使用submit():方法 注意:当用户点击提交按钮时,会触发submit事件,从而在这里我们有 ...

  5. 《JAVASCRIPT高级程序设计》第一章

    在使用调制解调器的时代,频繁的表单验证对客户端来说是一个很大的负担,javascript,作为一种专门进行表单验证的客户端脚本语言诞生了.到今天,javascript早已超越了当初设定的角色.Java ...

  6. 《JavaScript 高级程序设计》第一章:简介

    JavaScript 历史 JavaScript的诞生的主要是当时的 netspace 公司谋求为自己的浏览器 Navigator 添加一种脚本语言,以便在本地客户端进行一些行为操作,而这一功能的需求 ...

  7. 《JavaScript高级程序设计》——第一章JavaScript简介

    第一章主要讲了JavaScript的诞生和发展.刚刚接触JavaScript的我,似乎对这些内容并不感兴趣,快速看了一遍就开始去看第二章了. 看完第一章,收获也就是了解到JavaScript由ECMA ...

  8. javascript高级程序设计第5章,引用类型

    object类型: 创建object实列的方式有两种,一种是new()方法,一种是对象字面量表示法: 第一种法方:  var obj = new object(); obj.name = 'name' ...

  9. javascript高级程序设计第四章 变量、作用域和内存问题

    变量包含两种,,基本类型和引用类型 基本类型是指一些简单的字段: 引用类型是☞由多个值构成的对象  引用类型的值是保存在内存中的对象,在javascript中是不允许直接访问内存中的位置; 函数的参数 ...

  10. JavaScript高级程序设计:第九章

    第九章 一.使用能力检测 能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力.能力检测的基本模式如下: if ( object.propertyInQuestion ) { //使用object ...

随机推荐

  1. Python----文件的IO操作

    一.文件操作 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式打开一个文件用于只读.文件指针将会放在文件的开头.这是默认模式. r+ 打开一个文件用于读写.文件 ...

  2. ACdream 1732

    input 样例个数T           <=10000 每个样例一个n(2<=n<=10^8) output lcm(1,2,...,n)%2^32 Sample Input 5 ...

  3. scala正则表达式

       正则表达式     Scala 通过 scala.util.matching 包种的 Regex 类来支持正则表达式 scala.util.matching.Regex.构造一个Regex对象, ...

  4. 关于ajax后台success传来json数据的问题

    最近在使用JQuery的ajax方法时,需要返回的数据为json数据,在success返回中数据处理会根据返回方式不同会采用不同的方式来生成json数据.在$.ajax方法中应该是如何来处理的,简单进 ...

  5. python之~利用PIL模块在图片上写写画画

    借鉴了教程: http://yxnt.github.io/2016/05/15/Pillow-Python3.5/ 完成作业如下: 后来学着写给自己的图片加了水印. from PIL import I ...

  6. RPC学习

    之前有一篇文章,说了RPC的内容: http://www.cnblogs.com/charlesblc/p/6214391.html 如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对 ...

  7. 安卓.点击头像-->编辑个人姓名-->提交后.同时调用js关闭页面-->返回上一层

    $(document).ready(function() { $('#selfbtn').click(function(){ var u = navigator.userAgent; if (u.in ...

  8. hdu 1022 Train Problem I(栈)

    #include<iostream> #include<vector> #include<cstring> #include<string> #incl ...

  9. 获取table表格的一些不为人知的属性

    JS获取表格的简便方法:获取tbody:tBodies   获取thead:tHead   获取tfoot:tFoot   获取行tr:rows   获取列td:cells 使用实例: oTable. ...

  10. oracle 11g高级 安装图解(摘自网络)

    使用的高级安装 启动OUI后出现“选择安装方式”窗口,我们选择:高级安装 步骤3:出现“选择安装类型”窗口,选择我们需要安装的版本.我们在此肯定是选择企业版. 至于产品语言不用选择,它会根据当前系统的 ...