JavaScript错误机制

JavaScript错误机制,第1张

JavaScript错误机制 1.Error 实例对象

JavaScript 解析或运行时,一旦发生错误,引擎就会抛出一个错误对象。 JavaScript原生提供 · 构造函数,所有抛出的错误都是这个构造函数的实例。

let err = new Error('出错了');
console.log(err.message); // "出错了"

上面代码中,我们调用 Error 构造函数,生成一个实例对象 errError 构造函数接受一个参数,表示错误提示,可以从实例的 message 属性读到这个参数。 抛出 Error 实例对象以后,
整个程序就中断在发生错误的地方,不再往下执行 Error 实例还提供 namestack 属性,分别表示错误的名称和错误的堆栈,但它们是非标准的,不是每种实现都有。

function throwit(){
  throw new Error('报错了');//抛出一个错误
}
2.原生错误类型

实例对象是最一般的错误类型, 在它的基础上,JavaScript 还定义了其他6种错误对象。

SyntaxError 对象是解析代码时发生的语法错误ReferenceError 对象是引用一个不存在的变量时发生的错误。RangeError 对象是一个值超出有效范围时发生的错误。主要有几种情况, 一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值。TypeError 对象是变量或参数不是预期类型时发生的错误。比如,对字符串、布尔值、 数值等原始类型的值使用new命令,就会抛出这种错误,因为new命令的参数应该是一个构造函数。URIError 对象是 URI 相关函数的参数不正确时抛出的错误,主要涉及 encodeURI()decodeURI()encodeURIComponent()decodeURIComponent()escape()和unescape()这六个函数。eval 函数没有被正确执行时,会抛出 EvalError 错误。该错误类型已经不再使用了, 只是为了保证与以前代码兼容,才继续保留。

以上这6种派生错误,连同原始的 Error 对象,都是构造函数。可以使用它们,手动生成错误对象的实例。
这些构造函数都接受一个参数,代表错误提示信息message

3.自定义Error

除了JS 原生提供的七种错误对象(Error TypeError ReferenceError EvalError SyntaxError RangeError URIError) 还可以定义自己的错误对象

class UserError extends Error {
  constructor(message) {
    super(message);
    this.message = message || '这是开发者自定义的错误';
    this.name = 'UserError';
  }
}

function test() {
  try{
    throw new UserError('测试')
  }catch (e){
    console.log(e.name);
    console.log(e.message);
    // UserError
    // 测试
  }
}
test();
4.throw 语句

throw 语句的作用时手动终端程序的执行 抛出一个错误

let x = -1;
if(x<=0){
  throw new Error('x必须为正数');
}

实际上 thorw 可以抛出任何类型的值 也就是说 他的参数可以是任何值

// 抛出一个字符串
throw 'Error!';
// Uncaught Error!

// 抛出一个数值
throw 42;
// Uncaught 42

// 抛出一个布尔值
throw true;
// Uncaught true

// 抛出一个对象
throw {
  toString: function () {
    return 'Error!';
  }
};
// Uncaught {toString: ƒ}

对于 JavaScript 引擎来说,遇到 throw 语句,程序就中止了。 引擎会接收到 throw 抛出的信息,可能是一个错误实例,也可能是其他类型的值

5.try…catch结构

一旦发生错误,程序就中止执行了。 JavaScript 提供了try...catch结构,允许对错误进行处理,选择是否往下执行。

try{
  throw new Error('出错了');
}catch(e){
  console.log(`${e.name}:${e.message}`)
  console.log(e.stack);
}
//Error:出错了
//Error: 出错了
//at Object.
console.log(111);

可以看到此处的 111 仍然执行了程序报错后 try...catch 可以捕获错误 并可以让程序继续执行 如果你不确定某些代码是否会报错, 就可以把它们放在try...catch代码块之中,便于进一步对错误进行处理。

try{
  fu()
}catch(e){
  //错误处理
}

6.finally 代码块

try...catch结构允许在最后添加一个 finally 代码块,表示不管是否出现错误,都必需在最后运行的语句。

function cleansUp() {
  try {
    throw new Error('出错了……');
    console.log('此行不会执行');
  } finally {
    console.log('完成清理工作');
  }
}
cleansUp()
// 完成清理工作
// Uncaught Error: 出错了……
//    at cleansUp (:3:11)
//    at :10:1

由于没有 catch 语句块,一旦发生错误,代码就会中断执行。 中断执行之前,会先执行 finally 代码块,然后再向用户提示报错信息。

function idle(x) {
  try {
    console.log(x);
    return 'result';
  } finally {
    console.log('FINALLY');
  }
}

idle('hello')
// hello
// FINALLY

try 代码块没有发生错误,而且里面还包括 return 语句, 但是 finally 代码块依然会执行。而且,这个函数的返回值还是 result
return 是排在 finally 之前执行的 只是等 finally 代码执行完毕之后才会返回 try...catch...finally 这三者之间的执行顺序

function f() {
  try {
    console.log(0);
    throw 'bug';
  } catch(e) {
    console.log(1);
    return true;
    console.log(2); // 不会运行
  } finally {
    console.log(3);
    return false; // 这句会覆盖掉前面那句 return
    console.log(4); // 不会运行
  }

  console.log(5); // 不会运行
}

var result = f();
// 0
// 1
// 3

result
// false

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/940154.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-17
下一篇 2022-05-17

发表评论

登录后才能评论

评论列表(0条)

保存