Error

Node.js Error错误免费看

错误类型、异常捕获、回调中的 Error 参数

04-17侠课岛    基础入门       

后端/Node.js/Node.js简明入门 20     0     309

在实际开发中,我们经常会遇到各种类型的错误,例如:当出现语法错误或运行时错误时,会触发 JavaScript 错误。当试图试访问一个不存在或没有访问的文件时,会触发系统错误等。

错误类型

我们可以将 Node.js 应用程序中遇到的错误分为下面四类:

  • 标准的 JavaScript 错误,例如 :
<EvalError>:当调用eval()失败时抛出。
<SyntaxError>:当使用非法JavaScript语法时抛出。
<RangeError>: 当一个值不在指定范围内时抛出。
<ReferenceError>:当使用未定义的变量时抛出。
<TypeError>:当传递错误的类型参数抛出。
<URIError>:当一个全局的URI函数被错误使用时抛出。
  • 系统错误,由底层操作系触发,例如:试图打开不存在的文件、试图使用已关闭的 socket 发送数据等。系统错误是对JavaScript错误Error对象的一个扩展,它们表示程序能够处理的操作错误,这些错误信息都是在系统级别生成的。系统错误实例中除Error实例中的属性外,还包括以下几个属性:
error.syscall:一个表示失败的系统调用信息的字符串。
error.errno:一个整数的错误码。
error.code:表示错误字符串,通常是大写字母E开头。
  • 断言错误,当 Node.js 检测到不应该发生的异常逻辑时触发。这类错误是通过 assert 模块抛出的错误。
const assert = require('assert')
assert.equal(1, 3, "断言错误");

运行后输出结果:

  • 自定义错误,在应用代码中由用户指定触发。 所有由 Node.js 引起的 JavaScript 错误与系统错误都继承自或实例化自标准的 JavaScript Error 类,且保证至少提供类中的属性。

异常捕获

所有 JavaScript 错误都会被作为异常处理,异常会立即产生并使用标准的 JavaScript throw 机制抛出一个错误。 这些都是使用 JavaScript 语言提供的 try...catch 语句处理的。如果不使用 try...catch 语句进行处理,那么Node.js 进程会立即退出。

示例:

如下所示,会抛出一个ReferenceError异常,因为变量 b 没有定义:

try {
  const a = 1;
  const c = a + b
} catch (err) {
  console.log(err);
}

我们将这段代码放到一个index.js文件中,然后在命令符中运行这个文件,如下所示:

Node.js 采用事件驱动、异步编程基制,这意味着 try...catch捕获不到异步处理发生的错误。针对这种情况,我们可以使用以下两种方式来捕获或传递错误:

  • Node.js 回调函数中的异常捕获

Node.js 中的异步 API 都会接受一个回调函数 callback,该函数会接受一个 Error 对象传入作为第一个参数。 如果第一个参数为 null 则表示未发生错误,如果是一个 Error 实例,则说明发生了错误,应该进行处理。

示例:

如下所示xkd.txt是一个不存在的文件:

const fs = require('fs');
fs.readFile('xkd.txt', function(err, data){
 if (err) {
  console.error('读取文件错误', err);
  return;
 }
 // 其它处理
});

运行上述代码,显示如下图所示:

  • 基于事件的错误处理

举个例子,例如当一个异步方法被一个 EventEmitter 对象调用时,可以通过对象 的'error'事件捕获并处理错误:

const net = require('net');
const connection = net.connect('localhost');

// 添加一个 'error' 事件句柄到一个流:
connection.on('error', (err) => {
  // 如果连接被服务器重置,或无法连接,或发生任何错误,则错误会被发送到这里。 
  console.error(err);
});

connection.pipe(process.stdout);

运行结果:

回调中的 Error 参数

大多数 Node.js 核心 API 锁所提供的异步方法都遵从错误信息优先的回调模式惯例,这种模式有时也称为 Node.js 式回调。

在这种模式中,一个回调函数首先被作为参数传给异步方法。当该方法完成操作或产生错误时,它会调用回调函数,并将可能存在的 Error 对象作为第一个参数传给回调函数。如果没有错误产生,那么第一个参数为 null

示例:

如下所示,代码中使用到了两个文件,假设test.txt文件存在,且里面有内容,而untest.txt文件不存在。我们运行下面这段代码:

const fs = require('fs');

function errorCallback(err, data) {
  if (err) {
    console.error('错误', err);
    return;
  }
  console.log(data.toString());
}

fs.readFile('test.txt', errorCallback);
fs.readFile('untest.txt', errorCallback);

运行代码,结果为:

第一次调用异步读取方法readFile时,因为test.txt文件存在,所以会读取文件中的内容。而untest.txt 文件不存在,所以会调用回调函数errorCallback ,并打印出错误信息。

JavaScript的 try…catch 机制不能用来截获异步方法产生的错误。

示例:

例如我们来看下面这段代码:

const fs = require('fs');
try {
  fs.readFile('untest.txt', (err, data) => {
    // 错误的假设:在这里抛出错误
    if (err) {
      throw err;
    }
  });
} catch (err) {
  // 这里不会截获回调函数中的 throw
  console.error(err);
}

上述代码中这样做是不行的,因为传递给 fs.readFile() 的回调函数是异步调用的。 当回调函数被调用时,程序早已退出其周围的代码(包括 try…catch 部分)。在回调函数内抛出异常在大多数时候会使 Node.js 进程崩溃。 但如果启用了domains,或者有与 process.on('uncaughtException')相关联的异常处理器,就可以截获这种错误。

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

20

本课评分:
  •     非常好
难易程度:
  •     适中的

内容目录


本文索引


|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?