Node.js中的Errors错误对象-JavaScript 错误与系统错误

 2015年12月17日    1018     声明


Errors错误对象会在Node.js程序发生异常时产生,Node.js中有两类错误对象:JavaScript 错误系统错误,但所有的错误都继承自JavaScriptError类。由于语法错误语言运行时引起的错误,会抛出JavaScript 错误,由于系统限制的操作引起的错误,会产生系统错误,Node.js将系统错误为一个增强的Error对象。


1. JavaScript 错误(JavaScript Errors


JavaScript错误是一个表示语言使用不当或语法错误的API。

1.1 类:Error

普通错误对象和其它错误对象不同,Error不会指示错误发现的原因。在Error被实例化时,它会记录下“堆栈”根踪信息,并有一个关于错误的描述。

Node.js中,系统错误JavaScript 错误都被封装为这个类的实例。

构造函数:new Error(message)

通过构造函数,可以实例化一个新的Error对象,其参数message可以设置其实例的.message属性。

实例属性:error.message

通过Error()实例化对象时被传递的字符串。这个信息会出现在堆栈追踪信息的第一行,这个属性只能在实例化时设置,实例化后修改这个属性值并不会改变堆栈追踪的第一行信息。

实例属性:error.stack

这个属性会返回一个错误追踪信息,该错误信息表示实例化时程序运行点的字符串。

示例如下:

 Error: itbilu.com error happening!
   at /home/itbilu/file.js:525:2
   at Frobnicator.refrobulate (/home/itbilu/business-logic.js:424:21)
   at Actor. (/home/itbilu/actors.js:400:8)
   at increaseSynergy (/home/itbilu/actors.js:701:6)

error.stack属性会按以下方式进行错误信息的格式化:

  • 第一行被格式化为错误类名: 错误信息
  • 之后是一系列以at开头的堆栈根踪信息。当V8有对这些信息的名称时,会显示对应的信息,不存在则显示错误位置。


类方法:Error.captureStackTrace(targetObject[, constructorOpt])

targetObject创建一个.stack属性,它表示Error.captureStackTrace被调用时,在程序中的位置。可选参数constructorOpt接受一个函数,如果指定时,所有constructorOpt以上的帧,包括constructorOpt,将会被生成的堆栈追踪信息忽略。

var myObject = {};

Error.captureStackTrace(myObject);

myObject.stack  // 类似于`new Error().stack`


类属性:Error.stackTraceLimit

.stackTraceLimit表示堆栈追踪信息的堆栈帧数的属性, 其初始值是10。可以被设置为任何有效的JavaScript数字,当值被改变后,就会影响所有的堆栈追踪信息的获取。如果设置为一个非数字值,堆栈追踪将不会获取任何一帧,并且会在要使用时报告undefined。 Class

1.2 类:RangeError

RangeErrorError的子类,该对象表示提供的参数没有在可接受范围值之内。示例如下:

require('net').connect(-1);  //抛出 RangeError异常,端口值应该 > 0 && < 65536


1.3 类:TypeError

TypeErrorError的子类,表示所提供的参数不合法的类型。例如,为一个可接受值为字符串参数的函数,传入一个非字符串参数时,将触发一个TypeError

require('url').parse(function() { }); //TypeError,参数应该是字符串


1.4 类:ReferenceError

ReferenceError同样是Error的子类,该对象表示试图去获取一个未定义的对象的属性。在大多数情况下它表示一个输入错误,或者是一个不完整的程序。

doesNotExist; // ReferenceError,在这段代码中这是一个不存在的变量


1.5 类:SyntaxError

ReferenceError的子类,表示程序代码不是合法的JavaScript。 发生此类错误时,通常表示这不一个完整的程序,在evalFunctionrequirevm中经常发生此类错误。

try {
  require("vm").runInThisContext("binary ! isNotOk -- itbilu.com");
} catch(err) {
  // 会触发一个 syntaxError
}


1.6 ExceptionsErrors

一个JavaScript Exceptions是一个无效操作或throw声明所抛出的结果的值。但是这些值不要求必须继承于Error,但所有的由Node.js或JavaScript运行时抛出的异常都必须是一个Error实例。


2. 系统错误(System Errors)

系统错误在程序运行时环境的响应中生成。理想情况下,它们表示程序能够处理的操作错误。这些错误信息都是在系统级别生成的,在类Unix系统中,可以运行:man 2 introman 3 errno命令查看详细的错误信息,也可以在线查看。 Node.js将系统错误为一个增强的Error对象,不完全是Error的子类,而是一个有额外成员的error实例。

2.1 类:System Error

该类具有以下额外属性:

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

error.errno:一个整数的错误码。

error.code:一个代表了错误码的字符串,通常是大写字母E开头。


2.2 一些常见的系统错误

下面是一些Node运行过程中经常遇到的错误,详细错误列表请查看:http://man7.org/linux/man-pages/man3/errno.3.html

EPERM: 操作不被允许

执行一个需要特殊权限的操作时,会出现此错误。

ENOENT: 指定的文件或目录不存在

这个一般在文件操作中产生,指定的路径不存在会发生此错误(文件或目录找不到时)

EACCES: 没有权限

试图以禁止的方式去访问一个需要权限的文件。

EEXIST: 文件已存在

执行一个要求目标不存在的操作,但目标文件已经存在。

ENOTDIR: 非目录

给定的路径存在,但不是目录。通常由fs.readdir产生

EISDIR: 是目录

需要指定的路径是目录,但给定的路径是一个文件。

EMFILE: 系统中打开太多文件

达到了系统中允许的文件描述符的最大数量,当进行下一个描述符请求,在已存在的最后一个描述符关闭之前,都会触发此错误。

通常在并行打开太多文件时触发,特别是在那些将进程可用的文件描述符数量限制得很低的操作系统中(如:OS X)。为了改善这个限制,在同一个SHELL中运行ulimit -n 2048命令,再运行Node.js进程。