总结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 相关文章推荐
prototype.js的Ajax对象
Sep 23 Javascript
jQuery 图像裁剪插件Jcrop的简单使用
May 22 Javascript
该如何加载google-analytics(或其他第三方)的JS
May 13 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
Sep 12 Javascript
jquery获取一组checkbox的值(实例代码)
Nov 04 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
Jun 29 Javascript
详解JavaScript中的every()方法
Jun 08 Javascript
解析Vue2.0双向绑定实现原理
Feb 23 Javascript
JavaScript异步加载问题总结
Feb 17 Javascript
Node.js API详解之 net模块实例分析
May 18 Javascript
springboot+vue实现文件上传下载
Nov 17 Vue.js
ElementUI实现el-form表单重置功能按钮
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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
Redis在Laravel项目中的应用实例详解
2017/08/11 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
利用Python写一个爬妹子的爬虫
2018/06/08 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
《鸟的天堂》教学反思
2014/02/27 职场文书
文明城市标语
2014/06/16 职场文书
实习介绍信模板
2015/01/30 职场文书
中学教师个人总结
2015/02/10 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL