Node.js 中常见类型错误解析
沉沙 2018-06-06 来源 : 阅读 1008 评论 0

摘要:Node.js应用中可能会发生多种类型的错误。如:当出现语法错误或运行时错误时,会触发JavaScript错误;当试图试访问一个不存在或没有访问的文件时,会触发系统错误;除JavaScript错误和系统错误外,用户还可以自定义错误。理解Node.js中错误类型,可以帮我们更好的进行错误处理和异常捕获。

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

1. 错误分类

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

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

(1)· 标准JavaScript错误,如:

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

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

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

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

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

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

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

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

(3)· 断言错误,这类错误在代码违反合法逻辑时,由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,在异常捕获后,可以通过以下两个属性来访问这些信息:

· error.message - 错误信息

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

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

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

2.2 系统错误

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

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

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

· 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相关知识,请关注职坐标WEB前端Node.js频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程