快速而优雅的处理 JavaScript 中的错误与异常(一键 get 新技能)

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼

写在前面

在我们的实际编程中,抛出异常(代码报错)是最正常不过的,但是怎么处理异常这就要因人而异的,有的人遇到异常,通常会通过某种办法解决这个异常或者将其隐藏;但是在 JavaScript 中提供了一套完整的处理异常的机制,使程序遇到异常还可以正确的执行。所以说异常处理的在实际应用的重要性是毋庸置疑的,一个完整的 Web 应用肯定有一套完整的异常处理机制。

这篇博客我们来介绍一下 JavaScript 处理

先说概念

什么是错误与异常

所谓的错误就是编程的过程中使程序不能正常运行的状态,也称为异常。

在 JavaScript 中所有的异常都是 Error 对象,遇到异常就会抛出一个 Error 对象, 这个对象中包含错误的描述信息。

通过 JavaScript 提供的异常处理语句,我们可以用结构化的方式来捕捉发生的错误,让异常处理代码与核心业务代码实现分离。

异常的分类

在实际的开发中,异常可以主要分为以下三种:

  1. 逻辑错误:逻辑错误是最难被追踪的错误类型。这些错误是由于程序运行的逻辑上出现错误,从而导致你的脚本程序并不能得到你想要的结果。
  2. JavaScript 自带错误:这是最为常见的错误类型,例如发生 JavaScript 的语法错误、代码引用错误、类型错误等,JavaScript 的引擎都会自动触发这些错误。
  3. 开发者主动抛出的错误:一般都是开发者为了满足自己的需求所定义出的错误

异常处理

try...catch 语句

try...catch 语句是 JavaScript 中处理异常的一种标准方式,语法结构如下所示:

try {
     // 供测试的代码块
}
 catch(err) {
     // 处理错误的代码块
} 

参数:

  • try 语句允许您定义一个代码块,以便在执行时检测错误。

  • catch 语句允许你定义一个要执行的代码块,如果 try 代码块中发生错误将会执行此代码块

  • err 一个标识符,此标识符表示一个 Error 对象,错误的类型与测试代码块中的错误与之对应。

示例代码如下所示

try {
  // 用于测试有没有出错的代码块
  console.log(v); // 此时v没有定义将会抛出异常
} catch (error) {
  // 抛出异常将执行此代码块
  console.log("上述代码有错误");
}

值得注意的是 trycatch 语句是成对出现的

finally 语句

finally 语句又称为终结块,此语句块会在 trycatch 语句结束之后执行,无论结果是否报错。

语法结构如下所示:

try {
     // 供测试的代码块
}
 catch(err) {
     // 处理错误的代码块
}  
finally {
     // 无论 try  catch 结果如何都执行的代码块
}

示例代码如下所示:

// var v
try {
  // 用于测试有没有出错的代码块
  console.log(v); // 此时v没有定义将会抛出异常
} catch (error) {
  // 抛出异常将执行此代码块
  console.log("上述代码有错误");
} finally {
  console.log('我必须被执行');
}

throw 语句

throw语句用来抛出一个用户自定义的异常。此异常可以是任何数据类型。当执行 throw 语句时,当前执行将会被停止,如果有 catch 块,则会执行 catch 块,否则将跳出循环。

语法格式如下:

throw expression; 
  • expression : 要抛出的表达式

使用throw语句来抛出一个异常。当你抛出异常时,expression 指定了异常的内容。

示例代码如下所示

// throw "错误"  // 输出 错误
throw false   // 输出 false

当然,throw后面也可以是一个对象

Error 对象

通过 Error 的构造器可以创建一个错误对象。当运行时错误产生时,Error 的实例对象会被抛出。一般情况下 Error 类型的错误很少见,基本都是其他错误类型的,但是其他错误类型都是继承于 Error 的。

Error 对象主要用于用户自定义的异常的基础对象。

除了 Error 对象外,JavaScript 还提供了如下几种预定义类型的错误

错误名描述
EvalError已在 eval() 函数中发生的错误
RangeError已发生超出数字范围的错误
ReferenceError已发生非法引用
SyntaxError已发生语法错误
TypeError已发生类型错误
URIError在 encodeURI() 中已发生的错误

Error的属性主要有如下两个

属性描述
name设置或返回错误名
message设置或返回错误消息(一条字符串)

创建 Error 对象的实例语法格式如下所示:

new Error([message)

参数

  • message: 可选,描述的错误信息

其他预定义类型的创建语法与 Error 相同

自定义异常类型

如果 JavaScript 提供的异常类型不能够满足我们,我们可以自定义属于自己的异常类型,这个自定义的异常类型一般都是继承 Error 的异常类型,而且可以通过 instanceof 关键字来表示属于那种异常类型。

先来看一下 Node.js 中提供的用于自定义异常类型所提供的属性和方法,如下所示

  • error.stack 属性:返回一个字符串,字符串的第一行会被格式化为 <error class name>: <error message>,且带上一系列栈帧(每一行都以 "at " 开头)。 每一帧描述了一个代码中导致错误生成的调用点。
  • Error.captureStackTrace(targetObject[, constructorOpt]) 方法:targetObject 表示一个对象,constructorOpt 表示对象的构造函数。作用:在 targetObject 上创建一个 .stack 属性

示例代码如下

function MyError(message) {
  this.message = message
  this.name = 'MyError'
  /*
   * Error.captureStackTrace(targetObject[, constructorOpt])
   * 参数 targetObject -> 表示一个对象
   * 参数 constructorOpt -> 表示对象的构造函数
   * 在targetObject上创建一个.stack属性, 调用是返回一个调用 Error.captureStackTrace() 的位置的字符串。
   */
  Error.captureStackTrace(this, MyError)
}
// 使自定义的错误类型与父级的原型链断开
MyError.prototype = Object.create(Error.prototype);
MyError.prototype.constructor = MyError;


// * 在node.js 环境中 new Error 会直接抛出异常 不适用于 node.js环境
// function MyError(message) {
//   this.name = 'MyError';
//   this.message = message || 'Default Message';
//   this.stack = (new Error()).stack;
// }
// MyError.prototype = Object.create(Error.prototype);
// MyError.prototype.constructor = MyError;

try {
  throw new MyError('错了');
} catch (e) {
  console.log(e);
}

MyError 的原型链如下所示:

写在最后

JavaScript 中的异常处理,在实际的开发中一般只做两件事情:

  1. 将异常改为提示信息
  2. 将异常输出到异常日志中查看错误信息。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一碗周.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值