我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Node端异常捕获怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Node端异常捕获怎么实现

这篇文章主要介绍“Node端异常捕获怎么实现”,在日常操作中,相信很多人在Node端异常捕获怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node端异常捕获怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

常见Node报错处理机制

try catch

try...catch是大家最常用的错误处理机制,Javascript语言内置的错误处理机制可以在检测到代码异常的时候直接进行捕获并处理。

function test() {    try {        throw new Error("error");    } catch(e) {        console.log(e);    } finally {        console.log("finally");    }}   test()

一般来说,throw 用于抛出异常,但是单纯从语言的角度,我们可以抛出任何值,也不一定是异常逻辑,但是为了保证语义清晰,不建议用 throw 表达任何非异常逻辑。try 语句用于捕获异常,用 throw 抛出的异常,可以在 try 语句的结构中被处理掉:try 部分用于标识捕获异常的代码段,catch 部分则用于捕获异常后做一些处理,而 finally 则是用于执行后做一些必须执行的清理工作。catch 结构会创建一个局部的作用域,并且把一个变量写入其中,需要注意,在这个作用域,不能再声明变量 e 了,否则会出错。在 catch 中重新抛出错误的情况非常常见,在设计比较底层的函数时,常常会这样做,保证抛出的错误能被理解。finally 语句一般用于释放资源,它一定会被执行,我们在前面的课程中已经讨论过一些 finally 的特征,即使在 try 中出现了 return,finally 中的语句也一定要被执行。

Node原生错误处理机制

大多数Node.js核心API都提供的是利用回调函数处理错误,之所以采用这种错误处理机制,是因为异步方法所产生的方法并不能简单地通过try...catch机制进行拦截。

const fs = require('fs');  function read() {    fs.readFile("/some/file/does-not-exist", (err, data) => {        if(err) {            throw new Error("file not exist");        }        console.log(data);    });}  read();

Promise

Promise是用于处理异步调用的规范,由于 JavaScript 特殊的 EventLoop 机制,由 Promise 异步产生错误是没有办法使用 try...catch 的。

Promise提供的错误处理机制,是通过catch方法进行捕获。

try {    Promise.reject()} catch(err) {    // 这里啥都 catch 不到    console.log(err)}
fs.copy(    buildStatic,    aresStatic).then(() => {    console.log(`${buildStatic} -> ${aresStatic}`)}).catch(err => {    // 这里可以捕获到报错    console.log(err)})

async/await + try catch

async/await语法糖加上try...catch语句进行的。这样做的好处是异步和同步调用都能够使用统一的方式进行处理了。

对于异步代码,建议统一转换成Promise然后采用async/await + try...catch这种方式进行处理。这样风格统一,程序的健壮性也大大加强。

async function one() {    // a未定义    a.b = 3}  async function test() {    try {        await one();    } catch(error) {        //  a is not defined        console.log(error);    }}  test();

unhandledRejection

实际开发中,总是会有一些 Promise 被遗漏掉catch处理,没有得到错误处理,会导致应用crash。我们可以通过**unhandledrejection** 事件捕获未处理的 Promise 错误。

实现原理:Node.js 会在每次 Tick 执行完后检查是否有未捕获的错误 Promise,如果有,则触发 unhandledRejection事件。

process.on('unhandledRejection', (reason, p) => {    console.log('Unhandled Rejection at:', p, 'reason:', reason);});

特殊情况如何捕获异常

如果是回调函数中捕获异常怎么做?用domain去捕获,domian捕获会抛出500错误,但是domain捕获有一个问题,会丢失栈信息,无法保证程序健康进行,所以要结束进程,在回调函数中process.exit(1),然后用node的server.close方法再去释放,server.close连接释放后自动结束进程,所以不用在server.close中去结束进程process.exit(1)uncaughtExpection捕获异常的的原理就是:uncaughtExpection事件存在回调函数process.on("uncaughtExpection",callback)时node不会强制结束进程,这样可弥补domain丢失stack的问题
所以domian去捕获绝大部分回调函数中的异常,uncaughtExpection去捕获丢失stack异常,这样就完整了

app.use(function(req,res,next){      var reqDomain = domain.create();      reqDomain.on("err",function(){        try {          var killTimer = setTimeout(function(){            process.exit(1);          },1000)          killTimer.unref();          server.close();          res.send(500);        } catch(e) {          // statements          console.log(e.stack);        }      })      reqDomain.run(next);  });process.on("uncaughtException",function(err){  console.log(err);  try{    var killTimer = setTimeout(function(){      process.exit(1)    },1000)    killTimer.unref();    server.close();  }catch(e){    console.log(e.stack);  }});

uncaughtException

uncaughtException 也是 NodeJS 进程的一个事件。如果进程里产生了一个异常而没有被任何Try Catch捕获会触发这个事件。

NodeJS 对于未捕获异常的默认处理是:

    - 触发 uncaughtException 事件

    - 如果 uncaughtException 没有被监听

    - 打印异常的堆栈信息

    - 触发进程的 exit 事件

所以如果某个报错没有被任意try catch捕获,且没有定义uncaughtException事件,就会导致程序退出。

process.on('unhandledRejection', (reason, p) => {    console.log('Unhandled Rejection at: Promise', p, 'reason:', reason)})

Express错误处理

Express中,路由或中间件报错处理可以通过特殊的中间件来完成。

一般中间件的参数为3个:req,resnext。如果你use一个4个参数的中间件,它将被Express视为错误处理中间件。

app.get('/a',function(req,res,next){    res.end('hahah');    next(new Error('错误啦'));});app.use('/a',function(err,req,res,next){    console.log('路由错误'+err);})//all error中间件app.use(function(err, req, res, next) {    console.log("Error happens", err.stack);});//错误传递,/a的错误处理首先匹配/a那个错误中间件,如果不用next就不会传递到全局错误处理中间件//如果在/a错误处理中间件里调用next(err) 那么全局错误中间件也会被执行

到此,关于“Node端异常捕获怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Node端异常捕获怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node端异常捕获怎么实现

这篇文章主要介绍“Node端异常捕获怎么实现”,在日常操作中,相信很多人在Node端异常捕获怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node端异常捕获怎么实现”的疑惑有所帮助!接下来,请跟着小编
2023-07-02

java怎么捕获异常

在Java中,凡是可能抛出异常的语句,都可以用try ... catch捕获。把可能发生异常的语句放在try { ... }中,然后使用catch捕获对应的Exception及其子类。多catch语句可以使用多个catch语句,每个catch分别捕获对应的Ex
java怎么捕获异常
2018-06-21

java怎么捕获sql异常

在Java中,可以使用try-catch块来捕获SQL异常。可以使用SQLException类来捕获SQL异常,如下所示:try {// 执行 SQL 查询或更新操作} catch (SQLException e) {// 处理 SQL
java怎么捕获sql异常
2024-04-09

java怎么捕获sql异常

Java中捕获SQL异常在Java中,使用try-catch块处理SQL异常。try块包含数据库操作,catch块捕获异常。SQLException类表示异常,提供错误码和消息。处理异常时,可以打印异常信息、获取错误代码和SQL状态,以及回滚事务。其他处理技巧包括使用PreparedStatement、连接池和异常处理框架。最佳实践包括始终使用try-catch块,提供有意义的异常消息,考虑使用异常处理框架,并测试异常处理。
java怎么捕获sql异常
2024-04-11

mysql异常捕获怎么处理

mysql异常处理包括两种方法:1. try-catch 块;2. 使用 mysqli_errno 和 mysqli_error 函数。异常处理步骤通常包括:1. 捕获异常;2. 检查错误代码;3. 采取适当行动,如终止脚本、重试查询或通知
mysql异常捕获怎么处理
2024-05-30

python try-except怎么捕获异常

这篇文章主要介绍“python try-except怎么捕获异常”,在日常操作中,相信很多人在python try-except怎么捕获异常问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python try-
2023-06-30

Java使用Catcher捕获异常的实现

本文主要介绍了Java使用Catcher捕获异常的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-20

qt程序异常结束怎么捕获异常

在Qt程序中捕获异常可以使用try-catch块来实现。例如:```cpptry {// 可能会抛出异常的代码} catch (const std::exception& e) {// 捕获到std::exception类型的异常qDebu
2023-09-16

python中怎么捕获多个异常

这篇文章给大家介绍python中怎么捕获多个异常,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、规则说明(1)执行try下的句子,如果引起异常,执行过程会跳到第一个except语句。(2)如果首个except中定义的
2023-06-15

Android中捕获全局异常实现代码

1、实现UncaughtExceptionHandler,在方法uncaughtException中处理没有捕获的异常。public class GlobalException implements UncaughtExceptionHan
2022-06-06

java异常级别与捕获的实现方法

本篇内容主要讲解“java异常级别与捕获的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java异常级别与捕获的实现方法”吧!这个是jdk 1.8文档中异常的种族描述可以看出Java异常
2023-06-20

SpringBoot怎么配置全局异常处理器捕获异常

本篇内容主要讲解“SpringBoot怎么配置全局异常处理器捕获异常”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么配置全局异常处理器捕获异常”吧!1.前言任何系统,我们不
2023-07-05

VB.NET中怎么实现异常迭代捕捉

VB.NET中怎么实现异常迭代捕捉,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。VB.NET异常迭代捕捉代码示例:Dim a As Integer = 10 Dim b As
2023-06-17

怎么用C语言的Setjmp和Longjmp实现异常捕获和协程

这篇文章主要介绍了怎么用C语言的Setjmp和Longjmp实现异常捕获和协程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用C语言的Setjmp和Longjmp实现异常捕获和协程文章都会有所收获,下面我们
2023-06-08

详解Java中多线程异常捕获Runnable的实现

详解Java中多线程异常捕获Runnable的实现1、背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常。所以要实现主线程对子线程异常的捕获。2、工具: 实现Runnable接口的LayerIn
2023-05-31

android 捕获系统异常并上传日志具体实现

在做项目时,经常会把错误利用异常抛出去,这样在开发时就可以通过手机抛出的异常排查错误。但是当程序开发完毕,版本稳定,需要上线时,为了避免抛出异常影响用户感受,可以用UncaughtExceptionHandler捕获全局异常,对异常做出处理
2022-06-06

纯c实现异常捕获try-catch组件教程示例

这篇文章主要为大家介绍了纯c实现异常捕获try-catch组件教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录