目录
一、try-catch-finally语句
当发生错误时,Javascript会停止执行并抛出错误信息,try-catch-finally语句可以处理代码中可能出现的错误信息,并保持代码正常运行。try子句用来定义存在错误风险的代码。catch子句用于捕获异常。finally子句在try和catch子句之后无论有无异常都会执行。catch和finally子句是可选的,但在try子句之后必须存在其中一个。代码被try-catch-finally语句包裹后效率会变低,try子句中应尽量少的包含可能出错的代码。
try
{
console.log(1);
}
console.log(2);
< Uncaught SyntaxError: Missing catch or finally after try
若try子句发生错误,错误点之后try子句之内的剩余未执行语句不会被执行,try子句之外的语句照常执行。catch子句用于捕获异常。发生异常时系统会把错误信息封装到一个error对象里面(error.name、error.message)并将error对象传递给catch的形参(形参名可以自定义)。
try
{
console.log("a");
console.log(b); //报错,错误信息被catch捕获
console.log("c"); //不会执行
}catch(e){
console.log(e.name + ":" + e.message); //打印错误信息
}
console.log("d"); //照常执行
只要finally子句存在,无论是try还是catch中的return语句都会被忽略。
function func(){
try
{
return 1; //忽略
}catch(e){
return 2; //忽略
}finally{
return 3;
}
}
func(); //3
二、错误类型
Javascript内置了七种错误类型。每种错误类型都是一个构造函数。每种错误类型都可以传入一个参数表示实际的错误信息。
new Error("demo"); //Error: demo
new EvalError("demo"); //EvalError: demo
new RangeError("demo"); //RangeError: demo
new ReferenceError("demo"); //ReferenceError: demo
new SyntaxError("demo"); //SyntaxError: demo
new TypeError("demo"); //TypeError: demo
new URIError("demo"); //URIError: demo
Error
Error是基本的错误类型,其他错误类型都继承自Error。
EvalError
eval函数没有被正确执行。ES5以上不在抛出该类型的错误。
RangeError
数值越界。数值超出有效范围。
ReferenceError
引用错误。非法或不能识别的对象
SyntaxError
语法解析错误。
TypeError
类型错误。变量或参数不是预期的类型。
URIError
url处理函数使用不当。与url相关的处理函数有六个,分别是encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()。
三、throw
throw可以创建并抛出异常(exception)。throw有两种形式,其一带括号形式如throw(exception),其二不带括号形式如throw exception。throw与try-catch-finally语句一起使用可以控制程序流,并生成自定义的错误消息。
exception操作数不能省略,可以是任何类型,但通常是一个Error对象或Error对象的子类。
throw 100; //抛出一个数字类型的异常
throw 'Hello world!'; //抛出一个字符串类型的异常
throw false; //排除一个布尔类型的异常
throw { name: 'JavaScript'}; //抛出一个对象类型的异常
throw new Error("demo"); //抛出Error对象
throw new SyntaxError("demo"); //抛出Error对象的子类
throw语句一般放在try子句中,throw抛出异常后,异常会被catch子句捕获(throw之后try子句之内的剩余未执行语句不会被执行)。异常未被捕获会导致程序中止(throw不放在try子句中或try子句没有配套的catch子句,throw抛出异常后程序中止)。
//throw抛出异常,异常被catch捕获,try-catch语句外的程序正常执行
try
{
throw "1";
console.log('2'); //不会执行
}catch(e){
console.log(e); //打印异常
}
console.log("3"); //正常执行,程序不会中止
< 1
< 3
throw '1'; //Uncaught 1, 异常未被catch捕获,程序中止
consloe.log('2'); //不会执行
try
{
throw 1;
console.log(2); //不会执行
}finally{
consloe.log(3); //正常执行
}
console.log(4); //不会执行,程序中止
< 3, Uncaught 1
try
{
throw n;
}catch (e) {
throw e; //重新抛出异常, 被当前try-catch语句外最近的catch捕获,若外层没有catch则中止程序
}
throw不仅可以抛出js内置的错误类型对象,也可以抛出自定义的错误类型对象。
//抛出js内置的错误类型对象
throw new Error("demo"); //Error: demo
throw new EvalError("demo"); //EvalError: demo
throw new RangeError("demo"); //RangeError: demo
throw new ReferenceError("demo"); //ReferenceError: demo
throw new SyntaxError("demo"); //SyntaxError: demo
throw new TypeError("demo"); //TypeError: demo
throw new URIError("demo"); //URIError: demo
//抛出自定义的错误类型对象
function MyError(name, message){
this.name = name;
this.message = message;
}
try
{
throw new MyError("1111", "2222");
}catch(e){
console.log(e.name, e.message);
}
< 1111 2222