JavaScript常见报错及处理方法

实际开发中,我们经常会遇到一些报错,有些错误可以定位到具体行,通过自己的开发经验就能够修复,而有些报错并不是那么容易搞定,熟悉JavaScript常见的报错有助于更加快速的优化自己的业务。今天,我们就来整理一下常见的错误类型吧。

常见的错误类型

  • Error: Error是基类型,其他的错误类型都是继承自该类型。

  • EvalError: 当函数eval()使用不正确的时候会抛出该错误,但是由于这个错误在不同浏览器中表现不一致,所以很少使用,也即很少遇到。

  • RangeError:当设置的数值超出相应的范围触发。比如,new Array(-30)。

  • ReferenceError:当引用一个不存在的变量时触发。比如:console.log(god)。

  • SyntaxError:语法错误。比如if大括号没闭合。

  • TypeError:类型错误,表示值的类型非预期类型时发生的错误。

  • URIError: 使用encodeURI()或decodeURI()函数时,传入的URI格式不正确时报错。

1、RangeError: Maximum call stack size exceeded

超出了最大堆栈的大小就会报错,就好像一个教室里只有100个同学,你叫同学出来一下,(⊙o⊙)…就尴尬了。

在使用递归时会消耗大量堆栈,导致浏览器抛出错误,因为浏览器给分配的内存不是无限的:

function Pow(x, n) {
 return x * Pow(x, n - 1);
}
Pow(10,5)

如此无止境的递归调用,会持续消耗浏览器内存,这是不可以的。

解决办法

我们需要设定一个条件来终止程序的运行,不然猴年马月才是个头。

function Pow(x, n) {
  if (n == 1) return x;
  return x * Pow(x, n - 1);
}
Pow(10,5)

2、ReferenceError: "god" is not defined

当引用一个没有定义的变量时,就会抛出一个ReferenceError。当你使用变量的时候,这个变量必须要声明,或者你可以确保它在你当前的脚本或作用域 (scope) 中可用。例如:

// 变量未声明
console.log(student);
fn();

// 错误的作用域   
function sum() {
  let score1 = 20, score2 = 30;
  return score1 + score2;
}
console.log(score1);

解决办法

我们可以对变量使用 var|let|const 进行声明,或提升变量的作用域。

// 变量未声明
let student;
function fn() {};
console.log(student);
fn();

// 错误的作用域
let score1 = 20, score2 = 30;
function sum() {
   return score1 + score2;
}
console.log(score1);

3、SyntaxError: Identifier 'god' has already been declared

如果某个变量已经被声明,又使用let再次声明就会报错。例如:

// let 重复声明
let Tom = 1;
let Tom = 2;

// 在函数中参数已经出现,函数里使用let重新声明
function fn(arg) {
 let arg = []
}

4、SyntaxError: Invalid or unexpected token

代码中有非法的字符或缺少必要的标识符,比如减号 ( - ) 与连接符 ( – ) ,或者是英文双引号 ( " ) 与中文双引号 ( “ )。例如:

// 遗漏的字符
let str = 'string;
let colors = ['#000', #333', '#666'];

// 使用特殊字符
let str1 = 'string";
let str2 = 5#5;

// 错配字符(使用中文引号字符)
let str3 = ‘string’;

这些错误看一眼可能无法被修复,记住对应的错误提示就很容易定位了。

5、SyntaxError: Unexpected end of input

意外的终止输入会造成这个报错,比如代码中的括号或者引号不匹配。编码时,括号应该成对出现。

// 缺少括号
if (true)
let obj = {id: 1
let arr = [1,2,3

// 缺少结束符号
(function () {
    console.log('哈哈哈');
}()

6、TypeError: Cannot read property 'god' of undefined

如果无法读取属性'god', 或无法设置属性'god'。访问或设置未定义(undefined)或null值的属性时会发生这种报错。

// undefined
let Tom = undefined;
Tom.id; // 读取
Tom.id = 123; // 设置

// null
let Tom = null; 
Tom.id  // 读取
Tom.id = 567 // 设置
null.filter(item=>item)

我们可以使用逻辑运算符&&来避免这种错误。

let obj = undefined;
console.log(obj && obj.id);

6、TypeError: 'god' is not a constructor

使用不是构造器的对象或者变量来作为构造器使用就会报错。

let Student = 1;
new Student();

7、SyntaxError: Invalid regular expression flags

正则表达式标志无效,代码中出现了无效的正则表达式的标记。

let reg = /tom/mick;

8、DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL

无效的url,在使用ajax 请求时url错误,导致请求失败。

function createXHR(url) {
      let xhr = new XMLHttpRequest();
      xhr.open('POST', url, true);
      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      xhr.send('user=admin');
      xhr.onreadystatechange = function () {
      }
  }
  createXHR('http://127.0.0.1.8080') // 错误url
  createXHR('http:/127.0.0.1:8080/open') // 缺少 /

异常调试及捕获

try/catch,JavaScript中处理异常的一种模式,try用于可能会发生错误的代码,catch对错误的处理。

try{
  // 可能会导致错误的代码
}catch(error) {
  // 错误处理
}

Promise的异常处理,Promise执行中,本身自带try...catch的异常处理,出错时,将错误Rejact函数。

new Promise((resolve, reject) => {
   throw new Error('error!');
}).catch(err);

 欢迎关注公众号【前端技术驿站】,关注获取视频资源,共同学习!

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 网络请求报错 code = 1002 通常表示 WebSocket 连接关闭的异常,可能是因为网络中断、服务器关闭或其他原因导致 WebSocket 连接失败。解决此问题的方法主要有以下几种: 1. 检查网络连接是否正常,确保网络连接稳定。 2. 检查服务器是否正常工作,可以尝试使用其他网络设备或浏览器连接服务器,或联系服务器管理员排查问题。 3. 确认 WebSocket 协议是否正确,可以查看相应的文档或代码,检查协议是否符合规范。 4. 尝试使用其他 WebSocket 客户端或库进行连接,比如使用 Python 的 websocket 库或 JavaScript 的 WebSocket API 等。 5. 如果以上方法都无法解决问题,可以尝试重新启动客户端或服务器,或者重新编写代码进行调试。 ### 回答2: 网络请求报错 code = 1002 是指在进行网络请求时,服务器返回了一个错误码为1002的响应。这种错误通常表示客户端请求的参数或格式不正确,服务器无法正确处理请求。 要处理这个错误,我们可以按照以下步骤进行: 1. 检查网络连接:首先,我们需要确保设备与服务器的网络连接正常,确认网络稳定性,可以尝试重新连接网络或切换到其他网络。 2. 检查请求参数:错误码1002通常意味着客户端请求的参数或格式不正确。我们需要仔细检查请求的参数是否符合服务器的要求。可以检查请求的URL、请求方法(GET、POST等)、请求头、请求体等。确保请求参数的类型、格式、长度等都符合服务器的要求。 3. 检查请求头信息:某些情况下,服务器在处理请求时会根据请求的头信息进行判断和处理。我们需要检查请求的头信息是否正确,包括Content-Type、Authorization等。 4. 处理错误响应:在接收到错误码为1002的响应时,我们需要对错误进行处理。可以根据错误码进行相应的处理逻辑,比如重新发送请求、提示用户输入正确的参数、调整请求格式等。同时,我们也可以根据服务器返回的错误信息进行精确定位和解决问题。 5. 联系服务器管理员或开发人员:如果以上步骤都没有解决问题,我们可以联系服务器的管理员或开发人员,向他们反馈具体的错误信息和请求情况,寻求更详细的帮助和解决方案。 总之,处理网络请求报错code=1002的关键在于仔细检查请求参数和格式是否正确,并根据具体情况调整请求、处理错误响应。 ### 回答3: 网络请求报错 code = 1002 通常表示客户端请求出现了一些问题,以下是一些常见处理方法: 1. 检查网络连接: 首先要确保网络连接正常,可以尝试刷新页面或者重新连接网络。如果使用的是Wi-Fi网络,可以尝试切换到移动数据网络或者连接其他可用的Wi-Fi网络。 2. 检查请求参数: code = 1002 可能是因为客户端发送的请求参数有误。需要仔细检查请求中的参数是否正确、完整,并且按照接口文档的要求进行填写。 3. 重新请求: 如果经过检查网络连接和请求参数之后依然出现 code = 1002 错误,可以尝试重新发送请求。有时候服务器可能会出现临时问题,重新发送请求可能会解决问题。 4. 检查服务器状态: 如果多次尝试之后仍然无法解决问题,可以考虑检查服务器的状态。可能是服务器出现了故障或者维护,导致无法正常处理请求。可以联系后端开发人员或者系统管理员进行排查和修复。 5. 查看错误日志: 如果有日志系统记录了请求错误的详细信息,可以查看相应的错误日志来获取更多的错误细节。根据错误日志提供的信息,可以更准确地判断和解决问题。 总之,处理网络请求报错 code = 1002 需要从网络连接、请求参数、重新请求、服务器状态和错误日志等方面进行综合考虑,逐一排查和解决可能的问题,最终找到引起报错的具体原因并修复。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值