总结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 相关文章推荐
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
Apr 01 Javascript
jQuery随便控制任意div隐藏的方法
Jun 28 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
Nov 19 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
Apr 16 Javascript
form.submit()不能提交表单的错误原因及解决方法
Oct 13 Javascript
JavaScript生成的动态下雨背景效果实现方法
Feb 25 Javascript
原生JS实现图片懒加载(lazyload)实例
Jun 13 Javascript
vue2.0中click点击当前li实现动态切换class
Jun 21 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
Jul 20 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
Sep 01 Javascript
详解mpvue scroll-view自动回弹bug解决方案
Oct 01 Javascript
解决vue组件销毁之后计时器继续执行的问题
Jul 21 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
利用static实现表格的颜色隔行显示的代码
2007/09/02 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
网页中返回顶部代码(多种方法)另附注释说明
2013/04/24 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
js实现中文实时时钟
2020/01/15 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
Python计算程序运行时间的方法
2014/12/13 Python
Python3字符串学习教程
2015/08/20 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
python标准库os库的函数介绍
2020/02/12 Python
Python itertools.product方法代码实例
2020/03/27 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
电子商务专业自我鉴定
2013/12/18 职场文书
2014年学生工作总结
2014/11/20 职场文书
高中家长意见怎么写
2015/06/03 职场文书
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python