Node.js——异常处理

张开发
2026/4/4 5:28:58 15 分钟阅读
Node.js——异常处理
异常处理1、使用throw关键字抛出异常2、Error错误对象3、使用try...catch语句捕获异常4、异步程序中的异常处理1、使用throw关键字抛出异常throw关键字用于抛出一个异常它可以在特定的情形下自行抛出异常。throw语句的基本格式如下throwvalue参数value表示抛出的异常它的值可以是任何JavaScript类型的值包括字符串、数字或对象等​。例如在JavaScript代码中使用下面代码抛出不同类型的异常都是合法的throw程序出错了;//抛出了一个值为字符串的异常throw1;//抛出了一个值为整数1的异常throwtrue;//抛出了一个值为true的异常但在Node.js中通常不抛出这些类型的值而是抛出Error对象例如下面的代码thrownewError(程序出错了)2、Error错误对象Error对象是一个错误对象它由Error核心模块提供当使用Error对象时并不表明错误发生的具体情况它会捕获堆栈跟踪并提供所发生错误的描述内容。Error对象的使用方法如下newError(message)参数message表示要显示的错误信息。Error对象提供了一些属性用于获取错误相关的信息分别如下。name属性获取错误的类型名称比如内置错误类型TypeError等。message属性获取错误信息。stack属性获取代码中Error被实例化的位置。Error类是Node.js中所有错误类的基类其常用子类及说明如表所示。Error类的子类说明AssertionError断言错误RangeError表明提供的参数不在函数的可接受值的集合或范围内无论是数字范围还是给定的函数参数选项的集合ReferenceError表明试图访问一个未定义的变量此类错误通常表明代码有拼写错误或程序已损坏SyntaxError表明程序不是有效的JavaScript,.这些错误可能仅在代码评估的结果中产生和传播SystemError表明Nod©.js在运行时环境中发生异常时会生成系统错误这通常发生在应用程序违反操作系统约束时例如如果应用程序试图读取不存在的文件则会发生系统错误例如下面代码定义了一个代码块其中通过实例化Error对象创建了一个异常并使用throw关键字抛出该异常letsyncError(){thrownewError(自定义异常);}3、使用try…catch语句捕获异常异常定义之后需要在程序中捕获这时需要使用try…catch语句。try…catch语句允许在try后面的大括号{}中放置可能发生异常情况的程序代码以对这些代码进行监控在catch后面的大括号{}中放置处理异常的程序代码。try…catch语句的基本语法如下try{//可能会出错的代码出错时抛出一个错误}catch(e){//处理异常的代码}参数e表示捕获的异常。例如下面代码使用try…catch捕获17.3.2节示例代码中抛出的异常信息try{syncError()}catch(e){console.log(e.message)}console.log(异常被捕获)程序运行如下自定义异常 异常被捕获在开发程序时如果遇到需要处理多种异常信息的情况可以在一个try代码块后面跟多个catch代码块这里需要注意的是如果使用了多个catch代码块则catch代码块中的异常类顺序是先子类后父类。完整的异常处理语句应该包含finally代码块通常情况下无论程序中有无异常产生finally代码块中的代码都会被执行其语法格式如下try{//可能会出错的代码出错时抛出一个错误}catch(e){//处理异常的代码}finally{//最终执行的代码}使用try…catch…finally语句时不管try代码块内有没有抛出异常finally代码块总会被执行。如果try代码块内发生错误finally代码块将在catch代码块之后被执行如果没有发生错误将跳过catch代码块直接执行finally代码块中的代码。使用异常处理语句时可以不写catch代码块比如写成try…finally的形式但需要注意的是try代码块后必须至少跟一个catch或finally代码块不能只写try。例如使用同步方式读取一个文件并使用try…catch语句捕获文件不存在错误最后在finally代码块内输出“执行完毕”的提示代码如下constfsrequire(fs)try{vardatafs.readFileSync(test.txt,{encoding:utf8})}catch(err){console.log(文件不存在)throwerr;}finally{console.log(执行完毕!)}运行结果如下文件不存在 执行完毕!ENOENT:no such file or directory,opentest.txt4、异步程序中的异常处理如果是异步程序出现异常该如何捕获呢例如下面是一个异步代码块其中抛出了一个异常代码如下//模拟异步代码块内出现异常letasyncError(){setTimeout(function(){thrownewError(异步异常)},100)}如果我们使用传统的try…catch捕获上面异步代码中抛出的异常则写法应该如下(asyncfunction(){try{awaitasyncError()}catch(e){console.log(e.message)//处理异常}})()但在运行程序时却出现了如图所示的结果。通过上面示例代码可以看出异步代码中的异常是无法使用try…catch方法捕获的那么如何捕获异步程序中的异常呢Node.js中提供了两种方法用于捕获异步程序中的异常分别如下。process方式。process模块是Node.js提供给开发者用来和当前进程进行交互的工具通过监听它的uncaughtException事件可以处理所有未被捕获的异常包括同步代码块中的异常和异步代码块中的异常。例如下面代码用来捕获本节开始定义的异步代码中的异常process.on(uncaughtException,function(e){console.log(e.message)//处理异常});asyncError()domain方式。通过监听domain模块的error事件来处理异步代码块中的异常domain模块主要用来简化异步代码的异常处理它可以处理try…catch无法捕捉的异常。例如下面代码使用domain方式捕获本节前面定义的异步代码中的异常letdomainrequire(domain)letddomain.create()d.on(error,function(e){console.log(e.message)//处理异常})d.run(asyncError)使用process方式和domain方式都可以捕获异步代码块中的异常但process方式只适用于记录异常信息的场合因此在捕获异步代码库中的异常时推荐使用domain方式。

更多文章