JS 处理异常的方法

1. Error 类型构造函数

  1. Error:通用类型,所有错误的父类型
  2. EvalError(评估错误):与全局变量 eval() 有关的类型
  3. RangeError(范围错误):数值变量或参数超出其有效范围
  4. ReferenceError(参考错误):无效引用
  5. SyntaxError(语法错误):eval() 在解析代码的过程中发生的语法错误
  6. TypeError(类型错误):值的类型非预期类型时发生的错误
  7. URIError(URL 错误):给 encodeURL()decodeURL() 传递的参数无效
  8. AggregateError:一个错误对象,包含多个错误
  9. InternalError:出现在 JavaScript 引擎内部的错误
// RangeError (范围错误)
// 函数 fn1 重复调用自身,导致超出调用栈的大小,抛错
// 错误信息 Uncaught RangeError: Maximum call stack size exceeded
const fn1 = () => {
    fn1();
};
fn1();

// ReferenceError (参考错误)
// 访问的变量a未定义,抛出无效引用错误
// 错误信息 Uncaught ReferenceError: a is not defined
console.log(a);

// SyntaxError (语法错误)
// eval()函数 在解析代码的过程中发生的语法错误
// 错误信息 Uncaught SyntaxError: Unexpected identifier 'b'
eval("a++b");

// TypeError (类型错误)
// 变量a的值为null,无法在a身上读取到b属性,导致语法错误
// 错误类型 Uncaught TypeError: Cannot read properties of null (reading 'b')
let a = null;
console.log(a.b);

2. error 对象

  • 当代码运行时的发生错误,会创建新的 Error 对象,并将其抛出
  • 手动创建 error 对象
    可以使用 new 关键字,也可以不使用,创建的 error 对象都是一样的
    new Error类型构造函数(message)Error类型构造函数(message)
  • Error 构造函数的参数
    参数一 message :可选,一般是描述错误信息的字符串
    参数一 cause :可选,一般是描述错误具体信息的字符串,
    只有在构造函数中定义了 cause 属性,才有该属性,否则实例没有 cause 属性
// 创建一个error对象
// Error():error对象的构造函数
const err = new Error("人为抛错");

// 创建一个EvalError对象
const err = new EvalError("评估错误");

// 创建一个RangeError对象
const err = new RangeError("范围错误");

//其他类型额error对象也可以使用对应的错误类型构造函数创建

3. error 对象的属性和方法

  1. error 对象的属性
  • name:错误的类型名字
  • message:错误信息描述
  • cause:错误信息的具体描述,需要在构造函数中定义
  • stack:错误的堆栈轨迹,用于追踪错误来源
  1. error 对象的方法
  • toString():将 error 对象转化为字符串
    error.toString()
const err = new Error("抛错", { cause: "人为报错" });
console.log("err对象:", err);
console.log("err.name:", err.name);
console.log("err.message:", err.message);
console.log("err.cause:", err.cause);
console.log("err.stack:", err.stack);
console.log("将error对象转化为字符串:", err.toString());

4. 主动抛错

  • throw 语句用于抛出一个用户自定义的错误。
  • 当程序执行 throw 语句时,将会主动触发 js 编译报错,阻塞后续代码运行。
  • throw 语法:throw expression;(expression:异常的值)
// 直接使用
throw "这是一个人为抛错";
// 配合 Error构造函数 使用
throw new Error("这是一个人为抛错");

5. try...catch...finally... 语句

  • 可以有多个 try 块
  • 可以有多个 catch 块
  • 至少要有一个 catch 块或 finally 块
  • 可以 catch 块、finally 块兼有
  • 语法:
try {
    // 可能会发生错误的代码
} catch (error) {
    // 参数:error 捕获的报错信息
    // 如果捕获到错误,会触发 catch 内的代码
} finally {
    // 无论是否捕获到错误,都会触发 finally 内的代码
}

6. 无条件的 catch 语句

  • 当使用的 catch 语句未设置条件时,捕获到任何异常,都会执行 catch 块内的代码
  • catch 语句可以清理 try 语句中的报错代码阻塞。catch 语句会捕获 try 语句中的所有报错信息,并将其全部清理,从而跳过报错代码,让代码继续向后运行
// catch语句清理报错信息,代码可以经济学向后运行
try {
    console.log("语法错误:未定义的变量", a);
} catch (e) {
    console.log(`错误信息:${e}`);
}
console.log("代码没有阻塞");

// finally语句无法清理报错信息,代码阻塞,无法向后运行
try {
    console.log("语法错误:未定义的变量", a);
} finally {
    console.log(`finally`);
}
console.log("因代码报错阻塞,无法运行");

7. 条件 catch 语句

  • 可以给 catch 语句设置捕获满足条件的错误,只有捕获到满足要求的错误时,才会执行对应的 catch 语句内的代码
  • 可以设置多个不同条件的 catch 语句,分别执行捕获到不同错误时的代码
  • 既有无条件 catch 语句和条件 catch 语句时,无条件 catch 语句需要放到最后。如果无条件 catch 语句放首位,会将所有错误截获,导致后面的 catch 语句无法捕获到错误
  • 参数 error:catch 语句捕获到的错误信息
try {
    // 人为抛出一个 类型错误 的报错
    throw TypeError("类型错误");

    // 人为抛出一个 范围错误 的报错
    throw RangeError("范围错误");

    // 人为抛出一个 评估错误 的报错
    throw EvalError("评估错误");
} catch (e) {
    if (e instanceof TypeError) {
        console.error(e);
    } else if (e instanceof RangeError) {
        console.error(e);
    } else if (e instanceof RangeError) {
        console.error(e);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值