try-catch-finally语句、错误类型、throw

目录

一、try-catch-finally语句

二、错误类型

三、throw


一、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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值