大家好,我是 Echa。
本文将带你了解 Javascript 中常见的错误类型,处理同步和异步 JavaScript/Node.js 代码中错误和异常的方式,以及错误处理最佳实践!
1. 错误概述JavaScript 中的错误是一个对象,在发生错误时会抛出该对象以停止程序。在 JavaScript 中,可以通过构造函数来创建一个新的通用错误:
const err = new Error("Error");
当然,也可以省略 new 关键字:
const err = Error("Error");
Error 对象有三个属性:
- message:带有错误消息的字符串;
- name: 错误的类型;
- stack:函数执行的堆栈跟踪。
例如,创建一个 TypeError 对象,该消息将携带实际的错误字符串,其 name 将是“TypeError”:
const wrongType = TypeError("Expected number");
wrongType.message; // 'Expected number'
wrongType.name; // 'TypeError'
堆栈跟踪是发生异常或警告等事件时程序所处的方法调用列表:
它首先会打印错误名称和消息,然后是被调用的方法列表。每个方法调用都说明其源代码的位置和调用它的行。可以使用此数据来浏览代码库并确定导致错误的代码段。此方法列表以堆叠的方式排列。它显示了异常首先被抛出的位置以及它如何通过堆栈方法调用传播。为异常实施捕获不会让它通过堆栈向上传播并使程序崩溃。
对于 Error 对象,Firefox 还实现了一些非标准属性:
- columnNumber:错误所在行的列号;
- filename:发生错误的文件
- lineNumber:发生错误的行号
JavaScript 中有一系列预定义的错误类型。只要使用者没有明确处理应用程序中的错误,它们就会由 JavaScript 运行时自动选择和定义。
JavaScript中的错误类型包括:
- EvalError
- InternalError
- RangeError
- ReferenceError
- SyntaxError
- TypeError
- URIError
这些错误类型都是实际的构造函数,旨在返回一个新的错误对象。最常见的就是 TypeError。大多数时候,大部分错误将直接来自 JavaScript 引擎,例如 InternalError 或 SyntaxError。
JavaScript 提供了 instanceof 运算符可以用于区分异常类型:
try {
If (typeof x !== ‘number’) {
throw new TypeError(‘x 应是数字’);
} else if (x <= 0) {
throw new RangeError('x 应大于 0');
} else {
// ...
}
} catch (err) {
if (err instanceof TypeError) {
// 处理 TypeError 错误
} else if (err instanceof RangeError) {
// 处理 RangeError 错误
} else {
// 处理其他类型错误
}
}
下面来了解 JavaScript 中最常见的错误类型,并了解它们发生的时间和原因。
(1)SyntaxErrorSyntaxError 表示语法错误。这些错误是最容易修复的错误之一,因为它们表明代码语法中存在错误。由于 JavaScript 是一种解释而非编译的脚本语言,因此当应用程序执行包含错误的脚本时会抛出这些错误。在编译语言的情况下,此类错误在编译期间被识别。因此,在修复这些问题之前,不会创建应用程序二进制文件。
SyntaxError 发生的一些常见原因是:
- 缺少引号
- 缺少右括号
- 大括号或其他字符对齐不当
TypeError 是 JavaScript 应用程序中最常见的错误之一,当某些值不是特定的预期类型时,就会产生此错误。