前言
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中错误类型,就可以帮我们更好的进行错误处理和异常捕获。希望本文的内容对大家能有所帮助。
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]