Node.js应用中可能会发生多种类型的错误。如:当出现语法错误
或运行时错误时
,会触发JavaScript错误;当试图试访问一个不存在或没有访问的文件时,会触发系统错误
;除JavaScript错误
和系统错误
外,用户还能够自定义错误。理解Node.js中错误类型,能够帮咱们更好的进行错误处理和异常捕获。html
Node.js是一个JavaScript运行时平台,其应用发生错误都是一个Error
实例或Error
子类的实例。node
在Node.js应用中,可能发生的错误有如下4类:npm
标准JavaScript错误,如:编程
<EvalError> : 当调用 eval() 失败时抛出服务器
<SyntaxError> : 当使用非法JavaScript语法时抛出框架
<RangeError> : 当一个值不在指定范围内时抛出dom
<ReferenceError> : 当使用未定义的变量时抛出异步
<TypeError> : 当传递错误的类型参数抛出异步编程
<URIError> : 当一个全局的URI函数被错误使用时抛出函数
系统错误,这类错误由底层系统触发,如试图打开不存在的文件,试图经过已关闭的Soket发送数据时等
自定义错误,这类错误在应用代码中由用户指定触发
断言错误,这类错误在代码违反合法逻辑时,由Node.js的assert模块触发
标准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;
系统错误是对JavaScript错误Error
对象的一个扩展,它们表示程序可以处理的操做错误,这些错误信息都是在系统级别生成的。系统错误实例中除Error
实例中的属性外,还包括如下几个属性:
error.syscall - 一个表示失败的系统调用信息的字符串
error.errno - 一个整数的错误码
error.code - 表示错误字符串,一般是大写字母E
开头
更多关系JavaScript错误与系统错误的介绍:Node.js 中的JavaScript 错误与系统错误
Node.js采用事件驱动、异步编程基制,这意味着try / catc
h捕获不到异步处理发生的错误。针对这种状况,咱们能够使用如下两种方式来捕获或传递错误:
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中异常处理的介绍,请参考如下文章: