总结Node.js中的一些错误类型


Posted in Javascript onAugust 15, 2016

前言

Node.js应用中可能会发生多种类型的错误。如:当出现语法错误或运行时错误时,会触发JavaScript错误;当试图试访问一个不存在或没有访问的文件时,会触发系统错误;除JavaScript错误和系统错误错误外,用户还可以自定义错误。

1. 错误分类

Node.js是一个JavaScript运行时平台,其应用发生错误都是一个Error实例或Error子类的实例。

在Node.js应用中,可能发生的错误有以下4类:

     1、标准JavaScript错误,如:

          <EvalError> : 当调用 eval() 失败时抛出

          <SyntaxError> : 当使用非法JavaScript语法时抛出

          <RangeError> : 当一个值不在指定范围内时抛出

          <ReferenceError> : 当使用未定义的变量时抛出

          <TypeError> : 当传递错误的类型参数抛出

          <URIError> : 当一个全局的URI函数被错误使用时抛出

       2、系统错误,这类错误由底层系统触发,如试图打开不存在的文件,试图通过已关闭的Soket发送数据时等

       3、自定义错误,这类错误在应用代码中由用户指定触发

       4、断言错误,这类错误在代码违反合法逻辑时,由Node.js的assert模块触发

2. JavaScript错误与系统错误

2.1 JavaScript错误及自定义错误

标准JavaScript错误是由JavaScript语言提供的,表示语法错误或使用不当的API。所有错误都是一个Error类实例,而标准JavaScript错误会由语言本身在发生错误时构建。

自定义错误时,使用构造函数创建实例即可:

> throw new Error('出错了,这是错误信息');
Error: 出错了,这是错误信息
  at repl:1:7
  at REPLServer.defaultEval (repl.js:248:27)
  at bound (domain.js:280:14)
  at REPLServer.runBound [as eval] (domain.js:293:12)
  at REPLServer.<anonymous> (repl.js:412:12)
  at emitOne (events.js:82:20)
  at REPLServer.emit (events.js:169:7)
  at REPLServer.Interface._onLine (readline.js:210:10)
  at REPLServer.Interface._line (readline.js:549:8)
  at REPLServer.Interface._ttyWrite (readline.js:826:14)

如上,我们自定义了一个错误,并使用throw关键字将错误抛出。在这个错误对象中,包括错误信息message和错误的堆栈信息stack,在异常捕获后,可以通过以下两个属性来访问这些信息:

       1、error.message - 错误信息

       2、error.stack - 错误堆栈追踪信息

除Error实例本身的属性外,还可自定义一些错误属性。如,自定义一个表示状态的属性status:

var error = new Error('您访问的页面不存在');
error.status = 404;

2.2 系统错误

系统错误是对JavaScript错误Error对象的一个扩展,它们表示程序能够处理的操作错误,这些错误信息都是在系统级别生成的。系统错误实例中除Error实例中的属性外,还包括以下几个属性:

       1、error.syscall - 一个表示失败的系统调用信息的字符串

       2、error.errno - 一个整数的错误码

       3、error.code - 表示错误字符串,通常是大写字母E开头

3. 异常捕获

Node.js采用事件驱动、异步编程基制,这意味着try / catch捕获不到异步处理发生的错误。针对这种情况,我们可以使用以下两种方式来捕获或传递错误:

Node.js式回调函数中的异常捕获

Node.js有很多异步API,这些API通过回调函数callback进行后续处理。如果发生错误,通常会在callback函数的第一个参数中包含一个Error对象;如果未发生错误,第一参数将是null。如:

const fs = require('fs');
fs.readFile('一个不存在的文件', (err, data) => {
 if (err) {
  console.error('读取文件错误', err);
  return;
 }
 // 其它处理
});

基于事件的错误处理

如果对象是一个EventEmitter,可以通过对象 的'error'事件捕获并处理错误:

const net = require('net');
const connection = net.connect('localhost');

// 为stream添加一个 'error' 事件处理器:
connection.on('error', (err) => {
 // 如果连接被服务器重置或连接不到指定的服务器
 // 或其它连接错误时,错误会被传递到这里
 console.error(err);
});

connection.pipe(process.stdout);

总结

以上就是关于Node.js中的一些错误类型的总结,能够理解Node.js中错误类型,就可以帮我们更好的进行错误处理和异常捕获。希望本文的内容对大家能有所帮助。

Javascript 相关文章推荐
js操作table示例(个人心得)
Nov 29 Javascript
js简单抽奖代码
Jan 16 Javascript
jQuery实现定时读取分析xml文件的方法
Jul 16 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
Apr 01 Javascript
JS常用知识点整理
Jan 21 Javascript
微信小程序实现顶部选项卡(swiper)
Jun 19 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
May 03 jQuery
微信小程序 MinUI组件库系列之badge徽章组件示例
Aug 20 Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
Sep 25 Javascript
javascript实现图片轮换动作方法
Aug 07 Javascript
antd table按表格里的日期去排序操作
Nov 17 Javascript
自动化测试读写64位操作系统的注册表
Aug 15 #Javascript
Wireshark基本介绍和学习TCP三次握手
Aug 15 #Javascript
JavaScript中removeChild 方法开发示例代码
Aug 15 #Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
Aug 15 #Javascript
Web安全测试之XSS实例讲解
Aug 15 #Javascript
js中获取jsp表单中radio类型的值简单实例
Aug 15 #Javascript
卸载安装Node.js与npm过程详解
Aug 15 #Javascript
You might like
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
php无限极分类实现方法分析
2019/07/04 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
详解react组件通讯方式(多种)
2020/05/06 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
python实用代码片段收集贴
2015/06/03 Python
python实现BackPropagation算法
2017/12/14 Python
TensorFlow实现创建分类器
2018/02/06 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
Python遍历numpy数组的实例
2018/04/04 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
Python根据成绩分析系统浅析
2019/02/11 Python
python 求10个数的平均数实例
2019/12/16 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
校园招聘策划书
2014/01/09 职场文书
高三毕业寄语
2014/04/10 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
党员转正申请报告
2015/05/15 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
JavaScript的Set数据结构详解
2022/02/18 Javascript
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android