JavaScript-异常处理

(十三)异常处理

1. try/catch/finally

try/catch/finally 是 JavaScript 异常处理语句。

try {
    //调试代码块
} catch(e) {
    //捕获异常,并进行异常处理的代码块
} finally{
    //后期清理代码块
}

在正常情况下,JavaScript 按顺序执行 try 子句中的代码,如果没有异常发生,将会忽略 catch 子句,跳转到 finally 子句中继续执行。

如果在 try 子句运行时发生错误,或者使用 throw 语句主动抛出异常,则执行 catch 子句中的代码,同时传入一个参数,引用 Error 对象。

不管 try 语句是否完全执行,finally 语句最后都必须要执行,即使使用了跳转语句跳出了异常处理结构,也必须在跳出之前先执行 finally 子句。

2. Error

通过 Error 的构造器可以创建一个错误对象。当运行时错误产生时,Error 的实例对象会被抛出。Error 对象也可用于用户自定义的异常的基础对象。

创建自定义异常的语法:

new Error([message])

参数说明:

  • message:可选。可阅读的错误描述信息。

ECMA-262 规范了 7 种错误类型,具体说明如下。其中 Error 是基类,其他 6 种错误类型是子类,都继承 Error 基类。Error 类型的主要用途是自定义异常对象。
下面列出了各种内建的标准错误类型。

  • Error:普通异常。与 throw 语句和 try/catch 语句一起使用,属性 name 可以读写异常类型,message 属性可以读写详细错误信息。
  • EvalError:不正确的使用 eval() 方法时抛出。
  • SyntaxError:出现语法错误时抛出。
  • RangeError:数字超出合法范围时抛出、
  • ReferenceError:读取不存在的变量时抛出,无效引用。
  • TypeError:变量或参数不属于有效类型。
  • URIError:URI 编码和解码错误时抛出。例如,给 encodeURI()decodeURI() 传递的参数无效。

3. throw

throw 语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw 之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个 catch 块。如果调用者函数中没有 catch 块,程序将会终止。

try {
    console.log('before throw');
    throw new TypeError('This is a TypeError');
    console.log('after throw'); // 这条语句不会执行
} catch (e) {
    console.log(e.name);
    console.log(e.message);
}
/*
before throw
TypeError
This is a TypeError
*/

4. 关于嵌套的 try 块

任何给定的异常只会被离它最近的封闭 catch 块捕获一次。当然,在 “inner” 块抛出的任何新异常 (因为 catch 块里的代码也可以抛出异常),将会被 “outer” 块所捕获。

try {
    try {
        throw new Error('oops')
    } catch (e) {
        console.log('[inner] ' + e.message);
        throw e;
    } finally {
        console.log('[inner] finally');
    }
} catch (e) {
    console.log("[outer] " + e.message);
}
/*
[inner] oops
[inner] finally
[outer] oops
*/

如果从 finally 块中返回一个值,那么这个值将会成为整个 try-catch-finally 的返回值,无论是否有 return 语句在 trycatch 中。这包括在 catch 块里抛出的异常。

try {
    try {
        throw new Error('oops')
    } catch (e) {
        console.log('[inner] ' + e.message);
        throw e; // 这里抛出的异常被 return 语句给覆盖了,所以外层无法捕获
    } finally {
        console.log('[inner] finally');
        return;
    }
} catch (e) {
    console.log("[outer] " + e.message); // 无法捕获内层抛出的异常
} finally {
    console.log('[outer] finally');
}
/*
[inner] oops
[inner] finally
[outer] finally
*/
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K I S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值