究竟 javascript 错误处理有哪些类型?
有时候,在自己封装的工具函数中,不传参或传入了错误类型的参数,也要适当的抛出一些错误以示警告;使用框架不正常情况下也会抛出错误,如果对错误一无所知,便无从下手调试。综合上述,了解错误的处理机制是多么必要。
以下是笔者归纳总结,如有误之处,欢迎指出。
错误构造函数
javascript规范中总共有8中错误类型构造函数
Error -- 错误对象
SyntaxError --解析过程语法错误
TypeError -- 不属于有效类型
ReferenceError -- 无效引用
RangeError -- 数值超出有效范围
URIError -- 解析URI编码出错
EvalError -- 调用eval函数错误
InternalError -- Javascript引擎内部错误的异常抛出, "递归太多"
其中两种做个特殊说明:
EvalError调用eval函数错误,已经弃用,为了向后兼容,低版本还可以使用。
InternalError 递归过深 抛出错误,多数浏览器未实现,属于非标准方法,生产环境禁用
继承关系
Error是错误的基类,其他类型都继承Error这个类,可以使用ES6中提供的Object.getPrototypeOf()来判断,一个类是否继承了另一个类。
console.log(Object.getPrototypeOf(SyntaxError) === Error); // trueconsole.log(Object.getPrototypeOf(TypeError) === Error); // trueconsole.log(Object.getPrototypeOf(RangeError) === Error); // trueconsole.log(Object.getPrototypeOf(URIError) === Error); // trueconsole.log(Object.getPrototypeOf(EvalError) === Error); // trueconsole.log(Object.getPrototypeOf(ReferenceError) === Error); // true
来聊一聊每一种错误类型的使用和出错的场景。
Error
通过Error的构造器可以创建一个错误对象。当运行时错误产生时,Error的实例对象会被抛出。
语法:new Error([message])
参数:
message 可选,错误描述信息。
抛出错误
使用throw语句来抛出异常
throw new Error('这里抛出的是错误信息')
运行后,会在控制台打印输出:
Uncaught Error: 这里抛出的是错误信息
注意: 使用 throw 抛出异常后,之后的代码不再执行。
捕获错误
可以通过try{}catch(){}语句来捕获到这个错误
try{ throw new Error('这里抛出的是错误信息') }catch(err){alert(err.name + ' '+ err.message) }
属性说明:
当使用new Error创建错误实例后,会有两个属性:
let e = new Error('这里抛出的是错误信息');
name属性,为错误的类型,此时为Error
message属性,为错误的信息,此时为'这里抛出的是错误信息'
SyntaxError
解析过程语法错误,这种类型抛出的错误有很多,往往是书写时候造成的语法错误,例如:
let n = 1\1; // Uncaught SyntaxError: Invalid or unexpected token let str = "hel"lo" // Uncaught SyntaxError: Unexpected identifier let 123Var = 'hi' // Uncaught SyntaxError: Invalid or unexpected token
语法错误有很多就不一一列举了,当在浏览器运行时,控制台会抛错,并且告知第几行,所以调试器来比较方便。但要读懂错误的类型为SyntaxError,以及后面的错误信息,这样方便改错。
TypeError
不属于有效类型。这种错误就是在给的不是需要的类型而导致无法操作,会抛出类型错误。
变量或参数不是预期类型,
变量或参数不是预期类型
例如**new**运算符后必须是函数,而给定的不是函数,则会抛出类型错误
let fn = 'hello'; new fn;
抛出错误:
Uncaught TypeError: fn is not a constructor
调用对象不存在的方法
let obj = {}; obj.fn()
抛出错误:
Uncaught TypeError: obj.fn is not a function
当然你也可以在封装函数时候,强制传入的参数为指定类型,否则抛出类型错误。
function flatten(arr){ if( !Array.isArray(arr) ){ throw new TypeError('传入参数不是数组')} } flatten('test');
传入的参数不为数组时,抛出自定义的类型错误:
Uncaught TypeError: 传入参数不是数组
ReferenceError
无效引用。
引用了一个不存在的变量
console.log(a);
抛出错误
Uncaught ReferenceError: a is not defined
将变量赋值给一个无法被赋值的数据
这个错误常常犯的地方实在调用一个方法后在if语句中做判断,将比较运算符==写成了赋值运算符=,例如判断一个字符串第一个字符是不是指定的字符:
let str = 'hello';if( str.charAt(0) = 'h' ){console.log('第一个字符为h'); }
抛出错误:
Uncaught ReferenceError: Invalid left-hand side in assignment
RangeError
数值超出有效范围。在一些方法中,传入的数值必须在一定的范围内,否则会抛出超出范围的错误。
创建数组传入的长度小于了0
let arr = new Array(-1)
抛出错误:
Uncaught RangeError: Invalid array length
repeat方法重复指定的字符串重复次数小于0
let str = 'hello'; str.repeat(-1)
抛出错误:
Uncaught RangeError: Invalid count value
URIError
处理URI编码出错。函数参数不正确,主要是encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()这六个函数。
例如:
decodeURIComponent('%'); decodeURI('%2')
抛出错误:
Uncaught URIError: URI malformed
自定义错误类型
有时候希望自定义错误类型,需要自定义一个构造函数,然后让原型继承继承Error.prototype即可。
function MyErrorType(message){this.message = message || '错误';this.name = 'MyErrorType';this.stack = (new Error()).stack; // 错误位置和调用栈 } MyErrorType.prototype = Object.create(Error.prototype); MyErrorType.prototype.constructor = MyErrorType; throw new MyErrorType('自定义错误类型抛出错误')
关于调用的错误栈信息
提供的错误的跟踪功能,以什么样的调用顺序,在哪个文件的哪一行捕获到这个错误。
例如以下调用:
function trace() {try {throw new Error('myError');}catch(e) {console.log(e.stack);} } function b() {trace(); } function a() {b(3, 4, '\n\n', undefined, {});}a('first call, firstarg');
错误信息为:
Error: myErrorat trace (<Error.html>:3:14)at b (<Error.html>:10:6)at a (<Error.html>:13:6)at <Error.html>:15:4
以上为抛错的构造函数的总结,如有误之处欢迎扶正。
以上每一种错误场景并没有列出太多,如果你有新的错误信息发现,欢迎留言讨论。
转载于:https://www.cnblogs.com/Highdoudou/p/9816010.html
究竟 javascript 错误处理有哪些类型?相关推荐
- JavaScript 为什么要有 Symbol 类型?
摘要: 为什么比怎么用更有意义. 原文:JavaScript 为什么要有 Symbol 类型 作者:前端小智 Symbols 是 ES6 引入了一个新的数据类型 ,它为 JS 带来了一些好处,尤其是对 ...
- 浅谈JavaScript错误
本文主要从前端开发者的角度谈一谈大多数前端开发者都会遇到的js错误,对错误产生的原因.发生阶段,以及如何应对错误进行分析.归纳和总结,希望得到一些有益的结论用来指导日常开发工作. 概念辨析 错误(Er ...
- javascript错误处理与调试
视频课堂https://edu.csdn.net/course/play/7621 在程序开发中难免会遇到一些错误,在成千上万的代码中去寻找错误很明显相当于大海捞针,为此,每种计算机编程语言都要它独特 ...
- javascript --- 事件对象和事件类型
// 无论程序使用"DOM0级"规范还是"DOM2级"规范,都会在局部产生一个event对象, // 将其打印出来研究: <div id="di ...
- javascript错误处理与调试(转)
JavaScript 在错误处理调试上一直是它的软肋,如果脚本出错,给出的提示经常也让人摸不着头脑. ECMAScript 第 3 版为了解决这个问题引入了 try...catch 和 throw 语 ...
- JavaScript错误信息
总结一下JavaScript编程中会遇见的错误类型 JavaScript错误信息类型 1.SyntaxError 语法错误 变量名不规范 var 1 = 1: var 1ag = 1; 关键字赋值 n ...
- JavaScript错误与异常
JavaScript错误与异常 下面是对JavaScript错误与异常的整理,希望可以帮助到有需要的小伙伴. 1.错误与异常是什么 错误,指程序中的非正常运行状态,在其它编程语言中称为"异常 ...
- C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断...
C#保留2位小数几种场景总结 场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.25. ...
- javascript错误_JavaScript开发人员最常犯的10个错误
javascript错误 常见错误1:对" this'错误引用 (Common Mistake #1: Incorrect references to 'this') As JavaScri ...
最新文章
- python打开一个文件-python下几种打开文件的方式
- Scala 闭包详解
- ajax 设置Access-Control-Allow-Origin实现跨域访问
- 反思深度思考:不无脑的行动 有脑的持久行动
- InstallShield 2011正式发布
- 大数据上的“大产品”
- Java学习笔记13--比较器(Comparable、Comparator)
- Java教程:Java程序的运行过程(执行流程)分析
- makefile中伪目标的理解
- Win10 UWP版《芒果TV》v2.4.0直播超女,芒果台综艺一网打尽
- html注册页面教程视频,新手建站HTML 学习系列视频教程之HTML 简介
- button 和 input 的submit ,reset的区别
- DAP数据加工流程梳理
- [MSSQL2005]再看CTE
- win10:如何设置电脑睡眠只息屏
- 手披云雾开鸿蒙,元朝关于泰山的古诗词
- SM2 (含SM3、SM4)国密算法工具QT版,彻底搞懂sm2算法的使用
- 视觉和Lidar里程计
- 2019 校招多益网络软件开发java 笔试题
- 包含clob字段的数据入库sql怎么写
热门文章
- AI队列长度检测:使用Keras进行对象检测
- 简单事务:.NET Core应用程序的微服务示例体系结构
- 迁移潮来袭!数十个项目宣布即将停止支持 Python 2
- 服务器间 存活状态,Shell脚本监控LVS后台服务器存活状态
- java 注解 jpa_详解Spring Data JPA使用@Query注解(Using @Query)
- 《Deep Learning Methods for Reynolds-Averaged Navier-Stokes Simulations of Airfoil Flows》
- python单选题库答案_大学慕课2020用Python玩转数据题库及答案
- uni 修改数据页面不重新渲染
- php 2个经纬度之间的距离,php计算两个经纬度之间的距离
- 51单片机c语言教程温度计,单片机课程设计-数字温度计.doc