javascript--错误处理与调试

本文详细介绍了JavaScript中的各种错误类型,如Error、EvalError、RangeError等,以及如何使用try-catch语句和window.onerror事件处理函数来避免浏览器响应错误。同时,探讨了如何通过console对象、assert()函数和自定义错误类型进行有效的调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误类型
  1. Error:(其他错误类型的基类)
  2. EvalError:(使用eval()函数时发生异常;如果没有把eval当成函数调用,就会抛出;浏览器不一定在该抛出异常的时候抛出EvalError)
  3. RangeError:(数值超出了相应范围;如定义数组时,指定了数组不支持的项数new Array(-20))
  4. ReferenceError:(访问不存在的变量)
  5. SyntaxError:(把语法错误的JavaScript 字符串传入eval()函数时;如果语法错误的代码出现在eval()函数之外,会导致JavaScript 代码立即停止执行,不太可能使用SyntaxError)
  6. TypeError:(执行特定于类型的操作时,变量的类型并不符合要求;访问不存在的方法;var o = new 10;alert(“name” in true);Function.prototype.toString.call(“name”);)
  7. URIError:(在使用encodeURI()或decodeURI(),而URI 格式不正确时,就会导致URIError 错误。这种错误也很少见,因为这两个函数的容错性非常高。)
error instanceof TypeError//用这种方式判断错误类型,而message中的信息因浏览器而异,不用来判断错误类型

需要关注的错误类型:

  • 错误只在代码运行期间出现
  1. 类型转换错误
  • 使用全等和非全等操作符,可以避免发生因为使用相等和不相等操作符引发的类型转换错误。
  • 在流控制语句 if,for,while 中使用非布尔值,经常导致错误。要做到在条件比较时切实传入布尔值。
   if (typeof str3 == "string") //而不是if(str3)
  1. 数据类型错误
  • 不要将某个值与null或undefined比较,来确定传入函数的值是否有效,这样不够。
  • 不要只针对某一特性执行特性检测,如借判断某一函数是否存在来判断对象类型。
  • 在确切知道应该传入什么类型的情况下,基本类型的值应该使用typeof 来检测,而对象的值则应该使用instanceof 来检测。
  1. 通信错误
  • 格式不正确的URL 或发送的数据导致通信错误,最常见的问题是在将数据发送给服务器之前,没有使用encodeURIComponent()对数据进行编码。

致命错误:

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

  • 没有必要因为发生了非致命错误而对用户给出提示

把错误记录到服务器

  • 首先需要在服务器上创建一个页面(或者一个服务器入口点),用于处理错误数据。这个页面的作用无非就是从查询字符串中取得数据,然后再将数据写入错误日志中。
  • 这个页面可能会使用如下所示的函数:
function logError(sev, msg){
	var img = new Image();
	img.src = "log.php?sev=" + encodeURIComponent(sev) +"&msg=" +encodeURIComponent(msg);
}
  • 这个logError()函数接收两个参数:表示严重程度的数值或字符串(视所用系统而异)及错误消息。
  • 其中,使用了Image 对象来发送请求,这样做非常灵活
     所有浏览器都支持Image 对象,包括那些不支持XMLHttpRequest 对象的浏览器。
     可以避免跨域限制。通常都是一台服务器要负责处理多台服务器的错误,而这种情况下使用XMLHttpRequest 是不行的。
     在记录错误的过程中出问题的概率比较低。
  • 只要是使用try-catch 语句,就应该在catch语句中把相应错误记录到日志中。

  • 避免浏览器响应JavaScript 错误的方法
  1. try-catch语句
  2. window.onerror事件处理函数
try-catch(error)-finally语句
  • catch块会接收到包含错误信息的对象,其message属性保存着错误信息,name属性保存错误类型。
  • 只要代码中包含finally子句,try和catch语句块中的return语句不会生效。
throw语句抛出错误
  • 在遇到throw 操作符时,代码会立即停止执行。仅当有try-catch 语句捕获到被抛出的值时,代码才会继续执行。
throw new Error("Something bad happened.");
  • 利用原型链通过继承Error 来创建自定义错误类型
function CustomError(message){
this.name = "CustomError";
this.message = message;
}
CustomError.prototype = new Error();
throw new CustomError("My message");
  • IE 只有在抛出Error 对象的时候才会显示自定义错误消息。对于其他类型,它都显示"exception thrown and not caught"
  • 良好的错误处理机制应该可以确保代码中只发生你自己抛出的错误。

error事件
  • 任何没有通过try-catch 处理的错误都会触发window 对象的error 事件
  • Opera和Safari 不支持error 事件
  • 在任何Web 浏览器中,onerror 事件处理程序都不会创建event 对象,
    但它可以接收三个参数:错误消息、错误所在的URL 和行号。多数情况下,只有错误消息有用,因为URL 只是给出了文档的位置,而行号所指的代码行既可能出自嵌入的JavaScript 代码,也可能出自外部的文件。
  • 要指定onerror 事件处理程序,必须使用如下所示的DOM0 级技术
window.onerror = function(message, url, line){
	alert(message);
	return false;
	//在事件处理程序中返回false,可以阻止浏览器报告错误的默认行为。
};
  • 在IE 中,即使发生error事件,代码仍然会正常执行;所有变量和数据都将得到保留,因此能在onerror 事件处理程序中访问它们。
    但在Firefox 中,常规代码会停止执行,事件发生之前的所有变量和数据都将被销毁,因此几乎就无法判断错误。
  • 图像也支持error 事件。图像的src 特性中的URL 不能返回可以被识别的图像格式,就会触发error 事件。此时的error 事件遵循DOM格式,会返回一个以图像为目标的event 对象。

调试技术
  1. 将消息输出到控制台
  • 通过console 对象向JavaScript 控制台中写入消息,这个对象具有下列方法。
     error(message):将错误消息记录到控制台
     info(message):将信息性消息记录到控制台
     log(message):将一般消息记录到控制台
     warn(message):将警告消息记录到控制台
  • Opera 10.5 之前的版本中,JavaScript 控制台可以通opera.postError(message)方法来访问。
  • 还有一种方案是使用LiveConnect,也就是在JavaScript 中运行Java 代码。Firefox、Safari 和Opera都支持LiveConnect,因此可以操作Java 控制台。
    通过下列代码就可以在JavaScript 中把消息写入到Java 控制台
java.lang.System.out.println("Your message");
  • 向控制台写入消息的统一接口
function log(message){
	if (typeof console == "object")
	{
		console.log(message);
	} else if (typeof opera == "object")
	{
		opera.postError(message);
	} else if (typeof java == "object" && typeof java.lang == "object")
	{
		java.lang.System.out.println(message);
	}
}
  1. 将消息记录到当前页面
  • 在页面中开辟一小块区域,用以显示消息。这个区域通常是一个元素,而该元素可以总是出现在页面中,但仅用于调试目的;也可以是一个根据需要动态创建的元素。
  1. 抛出错误
  • 对于大型应用程序来说,自定义的错误通常都使用assert()函数抛出。这个函数接受两个参数一个是求值结果应该为true 的条件,另一个是条件为false 时要抛出的错误。
function assert(condition, message)
{
   if (!condition)
   {
   	throw new Error(message);
   }
}

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

常见的IE错误
  1. 操作终止(operation aborted):
  • 在修改尚未加载完成的页面时,就会发生操作终止错误。发生错误时会出现一个对话框,告诉你“操作终止。”单击确定(OK)按钮,则卸载整个页面,继而显示一张空白屏。
  1. 无效字符(invalid character):
  • JavaScript 文件中存在无效字符(JavaScript 语法中未定义的字符)时,IE 会抛出无效字符(invalid character)错误。
  • Firefox 会抛出非法字符(illegal character)错误,Safari 会报告
    发生了语法错误,而Opera 则会报告发生了ReferenceError(引用错误),因为它会将无效字符解释为未定义的标识符。
  1. 未找到成员(Member not found):
  • 由于垃圾收集例程配合错误所直接导致的。
    如果在对象被销毁之后,又给该对象赋值,就会导致未找到成员错误。而导致这个错误的,一定是COM 对象。
  • 发生这个错误的最常见情形是使用event 对象的时候。IE 中的event 对象是window 的属性,该对象在事件发生时创建,在最后一个事件处理程序执行完毕后销毁。假设你在一个闭包中使用了event 对象,而该闭包不会立即执行,那么在将来调用它并给event 的属性赋值时,就会导致未找到成员错误。
document.onclick = function()
{
	var event = window.event;
	setTimeout(function()
	{
		event.returnValue = false; //未找到成员错误
	}, 1000);
};
  1. 未知运行时错误(Unknown runtime error):
  • 当使用innerHTML 或outerHTML 以下列方式指定HTML 时:
    1. 把块元素插入到行内元素时
    2. 访问表格任意部分(<table>、<tbody>等)的任意属性时
  • 其他浏览器会尝试纠正并隐藏错误
  1. 语法错误(syntax error):
  • 如果你引用了外部的JavaScript 文件,而该文件最终并没有返回JavaScript 代码,IE 也会抛出语法错误。
    例如,<script>元素的src 特性指向了一个HTML 文件,就会导致语法错误。报告语法错误的位置时,通常都会说该错误位于脚本第一行的第一个字符处。
  • 在服务器端组件动态生成JavaScript 的情况下,比较容易出现这种错误。很多服务器端语言都会在发生运行时错误时,向输出中插入HTML 代码。
  • 如果在追查语法错误时遇到了麻烦,我们建议你再仔细检查一遍引用的外部文件,确保这些文件中没有包含服务器因错误而插入到其中HTML。
  1. 系统无法找到指定资源(The system cannot locate the resource specified):
  • 在使用JavaScript 请求某个资源URL,而该URL 的长度超过了IE 对URL最长不能超过2083 个字符的限制时,就会发生这个错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值