抓住异常,解救你的代码世界:你应该了解的 JavaScript 异常类型

简介: 抓住异常,解救你的代码世界:你应该了解的 JavaScript 异常类型

JavaScript 中有多种异常类型,以下是其中一些常见的异常类型:

1. Error(错误)

Error 是 JavaScript 中最基本的异常类型,其他异常类型都继承自 Error 类型。它可以通过 throw 语句手动抛出,或者由 JavaScript 运行时自动抛出。

以下是几个可能导致错误的 JavaScript 代码案例:

  1. 未定义的变量:
console.log(x); // ReferenceError: x is not defined
  1. 方法不存在:
var obj = {};
obj.doSomething(); // TypeError: obj.doSomething is not a function
  1. 类型不匹配:
var num = "123";
console.log(num.toUpperCase()); // TypeError: num.toUpperCase is not a function
  1. 数组越界:
var arr = [1, 2, 3];
console.log(arr[5]); // undefined (没有错误),因为访问了不存在的索引
  1. 调用栈溢出(递归无限循环):
function foo() {
  foo();
}
foo(); // RangeError: Maximum call stack size exceeded
  1. JSON 解析错误:
var invalidJson = "{ key: 'value' }";
JSON.parse(invalidJson); // SyntaxError: Unexpected token k in JSON at position 2

这些只是常见的一些示例,JavaScript 中的错误类型还有很多。处理异常情况的最佳做法是使用 try-catch 块捕获和处理错误,以保证代码的稳定性和可靠性。

2. SyntaxError(语法错误)

语法错误通常在代码中存在语法错误时抛出。例如,括号未正确匹配、缺少分号等。

以下是几个可能导致语法错误的 JavaScript 代码案例:

  1. 括号不匹配:
console.log('Hello World'; // SyntaxError: Unexpected token ;
  1. 缺少分号:
var x = 5
console.log(x); // SyntaxError: Missing semicolon
  1. 不完整的函数定义:
function myFunction() {
  console.log('Hello World');
// SyntaxError: Unexpected end of input
  1. 错误的对象字面量语法:
var obj = {
  name: 'John'
  age: 30
}; // SyntaxError: Unexpected token :
  1. 非法的变量命名:
var 123abc = 'Hello'; // SyntaxError: Unexpected number
  1. 字符串引号不匹配:
var str = "Hello'; // SyntaxError: Unexpected string
  1. 关键字用作变量名:
var var = 'test'; // SyntaxError: Unexpected token var

这些是常见的一些导致语法错误的 JavaScript 代码示例。当遇到语法错误时,JavaScript 解析器无法理解代码,因此会抛出 SyntaxError 异常。在编写代码时,请仔细检查语法,并使用开发工具中的代码高亮和错误提示来帮助识别和解决语法错误。

3. TypeError(类型错误)

类型错误通常在使用了错误的数据类型或对某个值执行了不支持的操作时抛出。例如,对 undefined 或 null 值进行属性访问、调用非函数对象等。

以下是几个可能导致类型错误的 JavaScript 代码案例:

  1. 尝试调用非函数对象:
var x = 5;
x(); // TypeError: x is not a function
  1. 使用未定义的变量作为对象:
var obj;
obj.property = 123; // TypeError: Cannot set property 'property' of undefined
  1. 数组调用方法时使用错误的数据类型:
var arr = [1, 2, 3];
arr.toUpperCase(); // TypeError: arr.toUpperCase is not a function
  1. 对象属性访问时使用错误的数据类型:
var person = {
  name: "John",
  age: 30
};
console.log(person.name()); // TypeError: person.name is not a function
  1. 非法的操作符使用:
var x = "Hello";
var y = x - 5; // TypeError: Cannot convert string to number
  1. 函数参数类型不匹配:
function addNumbers(a, b) {
  return a + b;
}
addNumbers("1", 2); // TypeError: Cannot convert string to number

这些是常见的一些导致类型错误的 JavaScript 代码示例。处理类型错误的最佳做法是确保变量和对象具有正确的类型,并使用条件语句或强制类型转换来避免类型不匹配的操作。

4. ReferenceError(引用错误)

引用错误通常在引用了不存在的变量或函数时抛出。例如,访问未声明的变量或函数

以下是几个可能导致引用错误的 JavaScript 代码案例:

  1. 引用不存在的变量:
console.log(x); // ReferenceError: x is not defined
  1. 引用未声明的函数:
myFunction(); // ReferenceError: myFunction is not defined
var myFunction = function() {
  console.log('Hello World');
};
  1. 访问不存在的对象属性:
var obj = { name: 'John' };
console.log(obj.age); // ReferenceError: age is not defined
  1. 访问原型链上不存在的属性:
function Person(name) {
  this.name = name;
}
var person = new Person('John');
console.log(person.age); // ReferenceError: age is not defined
  1. 引用块级作用域外的变量:
if (true) {
  var x = 5;
}
console.log(x); // ReferenceError: x is not defined

这些是常见的一些导致引用错误的 JavaScript 代码示例。在编写代码时,请确保所有引用的变量、函数和属性都已经声明或存在,避免在作用域外部引用变量,并注意检查对象的属性是否存在。

5. RangeError(范围错误)

范围错误通常在使用了超出有效范围的值时抛出。例如,使用了超出数组边界的索引、传递了超出函数参数有效范围的值等。

以下是几个可能导致范围错误的 JavaScript 代码案例:

  1. 数组索引超出范围:
var arr = [1, 2, 3];
console.log(arr[5]); // RangeError: Index out of range
  1. 递归调用无限循环:
function infiniteLoop() {
  infiniteLoop();
}
infiniteLoop(); // RangeError: Maximum call stack size exceeded
  1. 设置超出有效日期范围的日期:
var date = new Date(2021, 13, 32);
console.log(date); // RangeError: Invalid date
  1. 调用函数时传递了过多的参数:
function sum(a, b) {
  return a + b;
}
sum(1, 2, 3, 4, 5); // RangeError: Too many arguments
  1. 数字超出了有效范围:
console.log(Number.MAX_SAFE_INTEGER + 1); // RangeError: BigInt number cannot be safely represented in JavaScript

这些是常见的一些导致范围错误的 JavaScript 代码示例。处理范围错误的最佳做法是确保数组索引和数字值在有效范围内,避免无限循环和超出有效范围的操作。在使用内置对象(如日期)时,确保传递的参数在有效范围内。如果需要处理大整数,请考虑使用 BigInt 类型来处理超过安全整数范围的数字。

6. EvalError(eval 错误)

EvalError 在使用 eval() 函数时发生错误时抛出,但在现代 JavaScript 中很少使用。

在最新的 ECMAScript 标准中,EvalError 已经被废弃并不再被使用。因此,在现代的 JavaScript 环境中,很少会出现 EvalError。

在过去,EvalError 通常用于表示与 eval() 函数相关的错误。这个错误类型已经被语法错误和运行时错误所取代。下面是一些可能导致 EvalError 的旧代码示例:

  1. 错误的 eval() 语法:
eval("1 +"); // EvalError: Unexpected end of input
  1. eval() 函数在严格模式下使用了声明语句:
"use strict";
eval("var x = 5;"); // EvalError: Cannot create variables in strict mode
  1. eval() 函数包含无效的 JavaScript 代码:
eval("10 *"); // EvalError: Invalid or unexpected token

需要注意的是,EvalError 在现代的 JavaScript 中已经被废弃,因此不建议在代码中使用它。相反,应该根据具体情况处理语法错误或运行时错误。

除了以上常见的异常类型,还有一些其他的异常类型,如 URIError(URI 错误)和 AggregateError(聚合错误)。URIError 在处理 URI 相关的操作时抛出,AggregateError 是在多个错误被捕获时封装了这些错误的对象。

通过捕获和处理异常,我们可以在运行时发生错误时采取相应的措施,例如给出适当的错误提示、回退到备用方案或记录错误日志。

相关文章
|
2月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
4月前
|
JavaScript 前端开发 算法
流量分发代码实战|学会用JS控制用户访问路径
流量分发工具(Traffic Distributor),又称跳转器或负载均衡器,可通过JavaScript按预设规则将用户随机引导至不同网站,适用于SEO优化、广告投放、A/B测试等场景。本文分享一段不到百行的JS代码,实现智能、隐蔽的流量控制,并附完整示例与算法解析。
118 1
|
5月前
|
JavaScript 前端开发
怀孕b超单子在线制作,p图一键生成怀孕,JS代码装逼娱乐
模拟B超单的视觉效果,包含随机生成的胎儿图像、医疗文本信息和医院标志。请注意这仅用于前端开发学习
|
7月前
|
存储 JSON 前端开发
|
5月前
|
JavaScript
JS代码的一些常用优化写法
JS代码的一些常用优化写法
89 0
|
7月前
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
594 9
|
8月前
|
前端开发 JavaScript
【Javascript系列】Terser除了压缩代码之外,还有优化代码的功能
Terser 是一款广泛应用于前端开发的 JavaScript 解析器和压缩工具,常被视为 Uglify-es 的替代品。它不仅能高效压缩代码体积,还能优化代码逻辑,提升可靠性。例如,在调试中发现,Terser 压缩后的代码对删除功能确认框逻辑进行了优化。常用参数包括 `compress`(启用压缩)、`mangle`(变量名混淆)和 `output`(输出配置)。更多高级用法可参考官方文档。
574 11
|
8月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~