如果现在立刻让你回答,说下你了解的js中有哪些错误类型?能说出几个?
日常开发中,我们会碰到各种各样的js报错信息。大部分情况,我们只要看到控制台有飘红,就知道代码执行有问题。但是这些错误都有哪些类型?可能没有太关注过,如果我们知道了这些错误类型出现的场景,那是不是对我们定位问题有所帮助,甚至能提高我们以后的代码质量。
基类 Error
Error是基类型,其他内置错误类型都是继承该类型,因此所有内置错误类型都是共享相同的属性(所有错误对象上的方法都是这个默认类型定义的方法)。
浏览器很少会抛出Error类型的错误,该类型主要用于抛出自定义错误。
构造函数
//创建一个错误 new Error([message[, fileName[,lineNumber]]]) //参数均为可选
实例上有哪些属性?
内置错误类型1 :ReferenceError(引用错误)
常见指数:🌟🌟🌟🌟🌟 不夸张的说,线上80%错误都是这个
表示引用错误,使用了未声明的变量。
错误之前的代码会执行,之后代码不会执行。
使用未声明的变量
把变量赋值给一个无法赋值的xx
表示:左侧的赋值无效
捕获一个错误
try { var a = undefinedVariable; } catch (e) { console.log(e instanceof ReferenceError); // true console.log(e.message); // "undefinedVariable is not defined" console.log(e.name); // "ReferenceError" console.log(e.fileName); // "Scratchpad/1" console.log(e.lineNumber); // 2 console.log(e.columnNumber); // 6 console.log(e.stack); // "@Scratchpad/2:2:7\n" }
新建错误
try { throw new ReferenceError('Hello', 'aaa.js', 10); } catch (e) { console.log(e instanceof ReferenceError); // true console.log(e.message); // "Hello" console.log(e.name); // "ReferenceError" console.log(e.fileName); // "aaa.js" console.log(e.lineNumber); // 10 console.log(e.columnNumber); // 0 console.log(e.stack); // "@Scratchpad/2:2:9\n" }
内置错误类型2:RangeError
常见指数:⭐⭐⭐ 说实话,不太常见,但很容易构造
会在数值越界时抛出.例如,定义数组时如果设置了不支持的长度,如-1,又或者没有给递归设置停止条件时触发。
该类型在JavaScript发生不多。
超过数组最大长度限制
自定义RangeError错误
var check = function(num) { if (num < MIN || num > MAX) { throw new RangeError('Parameter must be between ' + MIN + ' and ' + MAX); } }; try { check(500); } catch (e) { if (e instanceof RangeError) { // 处理越界错误 } }
内置错误类型3:TypeError
常见指数:⭐⭐⭐⭐ 使用ts之前可能会有,ts之后应该能干掉一大部分
TypeError在JavaScript中很常见,主要发生变量在运行时的访问不是预期类型,或者访问不存在的方法时,尤其是在使用类型特定的操作而变量类型不对时。
在给函数传参前没有验证的情况下,错误发生较多。
比如a变量是个基本类型,却被当做函数调用
比如访问不存在的方法
内置错误类型4:SyntaxError
常见指数:⭐⭐⭐⭐⭐ 太常见了,一般的在开发环境,调试的时候
这是最常见的错误。当我们输入 JS 引擎不能理解的代码时,就会发生这个错误。
JS 引擎在解析期间会捕获了这个错误,而不是运行时。
或者给eval()传入的字符串包含JavaScript语法错误时,也会抛出此异常
内置错误类型5:URIError
常见指数:⭐ 很少见
URIError只会在使用encodeURL()或decodeURL()时,传入了格式错误的URL时发生,但非常罕见,因为上面两个函数非常稳健.
比如对空格进行编码,然后把编码的结果改为非法的结果,对该结果再进行解码,就会抛出异常
内置错误类型6:EvalError
常见指数:0 稀有
会在使用eval()函数发生异常时抛出。
EvalError 不在当前ECMAScript规范中使用,因此不会被运行时抛出. 但是对象本身仍然与规范的早期版本向后兼容.
以下来自mdn
内置错误类型7:InternalError
常见指数:0 稀有
表示出现在JavaScript引擎内部的错误。
例如,递归过多导致了栈溢出.这类型并不是代码中通常要处理的错误,如果真的发生了这种错误,很可能代码哪里搞错了或者有危险.
但事实证明递归过多导致栈溢出报的是RangeError。