快速而优雅的处理 JavaScript 中的错误与异常(一键 get 新技能)
古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼
写在前面
在我们的实际编程中,抛出异常(代码报错)是最正常不过的,但是怎么处理异常这就要因人而异的,有的人遇到异常,通常会通过某种办法解决这个异常或者将其隐藏;但是在 JavaScript 中提供了一套完整的处理异常的机制,使程序遇到异常还可以正确的执行。所以说异常处理的在实际应用的重要性是毋庸置疑的,一个完整的 Web 应用肯定有一套完整的异常处理机制。
这篇博客我们来介绍一下 JavaScript 处理
先说概念
什么是错误与异常
所谓的错误就是编程的过程中使程序不能正常运行的状态,也称为异常。
在 JavaScript 中所有的异常都是 Error
对象,遇到异常就会抛出一个 Error
对象, 这个对象中包含错误的描述信息。
通过 JavaScript 提供的异常处理语句,我们可以用结构化的方式来捕捉发生的错误,让异常处理代码与核心业务代码实现分离。
异常的分类
在实际的开发中,异常可以主要分为以下三种:
- 逻辑错误:逻辑错误是最难被追踪的错误类型。这些错误是由于程序运行的逻辑上出现错误,从而导致你的脚本程序并不能得到你想要的结果。
- JavaScript 自带错误:这是最为常见的错误类型,例如发生 JavaScript 的语法错误、代码引用错误、类型错误等,JavaScript 的引擎都会自动触发这些错误。
- 开发者主动抛出的错误:一般都是开发者为了满足自己的需求所定义出的错误
异常处理
try...catch
语句
try...catch
语句是 JavaScript 中处理异常的一种标准方式,语法结构如下所示:
try {
// 供测试的代码块
}
catch(err) {
// 处理错误的代码块
}
参数:
-
try
语句允许您定义一个代码块,以便在执行时检测错误。 -
catch
语句允许你定义一个要执行的代码块,如果 try 代码块中发生错误将会执行此代码块 -
err
一个标识符,此标识符表示一个Error
对象,错误的类型与测试代码块中的错误与之对应。
示例代码如下所示
try {
// 用于测试有没有出错的代码块
console.log(v); // 此时v没有定义将会抛出异常
} catch (error) {
// 抛出异常将执行此代码块
console.log("上述代码有错误");
}
值得注意的是
try
和catch
语句是成对出现的
finally
语句
finally
语句又称为终结块,此语句块会在 try
和 catch
语句结束之后执行,无论结果是否报错。
语法结构如下所示:
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 中的异常处理,在实际的开发中一般只做两件事情:
- 将异常改为提示信息
- 将异常输出到异常日志中查看错误信息。
本文地址:https://blog.csdn.net/weixin_46163658/article/details/109373535
上一篇: 【拉钩教育】大前端技术分享
下一篇: 小程序基本标签与语法