天天看点

js调试技术--try-catch语句及抛出错误

1、try-catch语句进本语法

js中的try-catch语句与java中的语法完全一致,基本语法如下:

try{
//可能会导致错误的代码
}catch(error){
//错误发生时怎么处理
}
           

代码实例:创建一个html文件,如test.html

<!DOCTYPE html>
<html>
<head>
	<script type="text/javascript">
		try {
			window.someNonexistentFunction();
		} catch (error) {
				alert(error.message); //显示浏览器给出的消息
			}
	</script>
</head>
<body>
	<input type="button" id="btn" />
</body>
</html>
           

在Chrome中运行后会弹出如下错误信息 ,这个信息也是console控制台给出的信息,所以对调试并没有实际意义,只是熟悉一下语法

js调试技术--try-catch语句及抛出错误

2、错误类型

ECMA-262定义了如下7种类型:

(1) Error,基类型,其他错误都继承该类型,也是浏览器抛出的错误

(2) EvalError,该错误类型在使用eval()函数发生异常时被抛出;如果没把eval()当成函数调用,就会抛出错误,例如      

new eval();//抛出EvalError
eval=foo;//抛出EvalError

           

(3) RangeError,数值超出范围时抛出该错误,如数组超出下标范围等

(4) ReferenceError,找不到对象的情况下,会发生该错误,如使用未声明的对象,浏览器会抛出“object expected”

(5) SyntaxError,把语法错误的js字符传入eval()函数时,就会导致此错误,如eval(“a++b”);

(6) TypeError,在变量中保存意外类型时,或访问不存在的方法时都会导致该错误,归根结底还是由于在执行特定类型的操作时,变量的类型不符合要求所致,例如

var o = new 10;//抛出TypeError
alert("name" in true);//抛出TypeError
Function.prototype.toString.call("name");//抛出TypeError 
           

(7) URIError,在使用encodeURI()或decodeURI(),而格式不正确时,会导致该错误

要想知道错误类型,可以在catch语句中使用instanceof操作符

try {
			window.someFunction();
		} catch (error) {
				if (error instanceof TypeError) {
					//处理类型错误
				} else if (error instanceof ReferenceError) {
					//处理引用错误
				} else {
					//处理其他类型错误
				}
			}
           

 3、合理使用try-catch语句

当try-catch语句中发生错误时,浏览器会认为错误已经被处理了,因而不会记录或报告错误。

try-catch语句适合处理我们无法控制的错误。比如我们在使用一个大型JavaScript库中的函数时,该函数可能会抛出一些错误。由于我们无法修改源代码,所以可以将其放在try-catch语句中,处理那些意想不到的错误。

如果已经很清楚的知道自己的代码会发生错误就没必要使用try-catch语句了。

4、throw操作符抛出自定义错误

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

throw 123;

throw "hello";

throw true;

throw {name:"javascript"};
           

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

通过使用某种内置错误类型,可以模拟浏览器报出的错误,例如:

throw new Error("Something bad happened!");

throw new SyntaxError("Incoming parameter of eval() can't be recognized!");

throw new RangeError("out of the max range!");

throw new TypeError("Type error!");

throw new EvalError("The eval() is not a variable!");

throw new URIError("the format of URI is not correct!");

throw new ReferenceError("the object is not found!");



           

利用原型链可以通过继承Error来创建自定义错误类型。此时需要为新创建的错误类型指定name和message属性,例如

function CustomError(message){

this.name="CustomError";

this.message=message;

}

CustomError.prototype=new Error();

throw new customError("My message");
           

5、阻止浏览器报告错误的默认行为

如果没有try-catch语句处理,当代码出现错误时,浏览器会报告默认的errro信息,包括三个方面信息:错误消息、错误所在的URL和行号,然而有时候这些错误信息并没有什么用,因为错误所在的行可能时外部的文件或内嵌的js代码,导致错误信息不精确,因此需要阻止浏览器的这种默认错误报告,代码如下:

window.onerror=function (message,url,line){
alert(message);
return false;
};
           

通过返回false,这个函数就相当于充当了整个文档中的try-catch语句,可以捕获所有五代码处理的运行时错误,只要能搞适当地使用try-catch语句,就不会有错误交给浏览器,也就不会触发error事件。

6、常见http错误请求状态码

400 错误请求

401 未授权,用户需要进行验证

403 禁止访问

404 未找到资源

408 请求超时

414 请求的URI过长