返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Node 中出现脚本遭遇异常时如何安全退出
  • 266
分享到

Node 中出现脚本遭遇异常时如何安全退出

2024-04-02 19:04:59 266人浏览 泡泡鱼
摘要

本篇文章为大家展示了node 中出现脚本遭遇异常时如何安全退出,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Exit Code什么是 exit code?exit

本篇文章为大家展示了node 中出现脚本遭遇异常时如何安全退出,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Exit Code

什么是 exit code?

exit code 代表一个进程的返回码,通过系统调用 exit_group 来触发。在 POSIX 中,0 代表正常的返回码,1-255  代表异常返回码,一般主动抛出的错误码都是 1。在 Node 应用中使用 process.exitCode = 1 来代表因不期望的异常而中断。

这里有一张关于异常码的附表 Appendix E. Exit Codes With Special Meanings[1]。

异常码在操作系统中随处可见,以下是一个关于 cat 命令的异常以及它的 exit code,并使用 strace 追踪系统调用。

$ cat a cat: a: No such file or directory  # 使用 strace 查看 cat 的系统调用 # -e 只显示 write 与 exit_group 的系统调用 $ strace -e write,exit_group cat a write(2, "cat: ", 5cat: )                    = 5 write(2, "a", 1a)                        = 1 write(2, ": No such file or directory", 27: No such file or directory) = 27 write(2, "\n", 1 )                       = 1 exit_group(1)                           = ? +++ exited with 1 +++

从系统调用的最后一行可以看出,该进行的 exit code 是 1,并把错误信息输出到 stderr (标准错误的 fd 为 2) 中

如何查看 exit code

从 strace 中可以来判断进程的 exit code,但是不够方便过于冗余,特别身处 shell 编程环境中。

「有一种简单的方法,通过 echo $? 来确认返回码」

$ cat a cat: a: No such file or directory  $ echo $? 1

throw new Error与Promise.reject区别

以下是两段代码,第一段抛出一个异常,第二段  Promise.reject,两段代码都会如下打印出一段异常信息,那么两者有什么区别?

function error () {   throw new Error('hello, error') }  error()  // Output:  // /Users/shanyue/Documents/note/demo.js:2 //   throw new Error('hello, world') //   ^ // // Error: hello, world //     at error (/Users/shanyue/Documents/note/demo.js:2:9) //     at Object.<anonymous> (/Users/shanyue/Documents/note/demo.js:5:1) //     at Module._compile (internal/modules/cjs/loader.js:701:30)
function error () {   throw new Error('hello, error') }  error()  // Output:  // /Users/shanyue/Documents/note/demo.js:2 //   throw new Error('hello, world') //   ^ // // Error: hello, world //     at error (/Users/shanyue/Documents/note/demo.js:2:9) //     at Object.<anonymous> (/Users/shanyue/Documents/note/demo.js:5:1) //     at Module._compile (internal/modules/cjs/loader.js:701:30)

在对上述两个测试用例使用 echo $? 查看 exit code,我们会发现 throw new Error() 的 exit code 为 1,而  Promise.reject() 的为 0。

「从操作系统的角度来讲,exit code 为 0 代表进程成功运行并退出,此时即使有  Promise.reject,操作系统也会视为它执行成功。」

这在 Dockerfile 与 CI 中将留有安全隐患。

Dockerfile 在 node 中的注意点

当使用 Dockerfile 构建镜像时,如果 RUN 的进程返回非 0 的返回码,构建就会失败。

「而在 Node 中的错误处理中,我们倾向于所有的异常都交由 async/await 来处理,而当发生异常时,由于此时 exit code 为 0  并不会导致镜像构建失败。」

这是一个浅显易懂的含 Promise.reject() 问题的镜像。

FROM node:12-alpine  RUN node -e "Promise.reject('hello, world')"

构建镜像过程如下:「即使在构建过程打印出了 unhandledPromiseRejection 信息,但是镜像仍然构建成功。」

$ docker build -t demo . Sending build context to Docker daemon  33.28kB Step 1/2 : FROM node:12-alpine  ---> 18f4bc975732 Step 2/2 : RUN node -e "Promise.reject('hello, world')"  ---> Running in 79a6d53c5aa6 (node:1) UnhandledPromiseRejectionWarning: hello, world (node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1) (node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the node.js process with a non-zero exit code. Removing intermediate container 79a6d53c5aa6  ---> 09f07eb993fe Successfully built 09f07eb993fe Successfully tagged demo:latest

Promise.reject 脚本解决方案

能在编译时能发现的问题,绝不要放在运行时。所以,构建镜像或 CI 中需要执行 node  脚本时,对异常处理需要手动指定 process.exitCode = 1 来提前暴露问题

runScript().catch(() => {   process.exitCode = 1 })

在构建镜像时,也有关于异常解决方案的建议:

(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This  error originated either by throwing inside of an async function without a catch  block, or by rejecting a promise which was not handled with .catch(). To  terminate the node process on unhandled promise rejection, use the CLI flag  --unhandled-rejections=strict (see  Https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id:  1)

根据提示,--unhandled-rejections=strict 将会把 Promise.reject 的退出码设置为 1,并在将来的 node  版本中修正 Promise 异常退出码。

$ node --unhandled-rejections=strict error.js

--unhandled-rejections=strict 的配置对 node 有版本要求:

Added in: v12.0.0, v10.17.0

By default all unhandled rejections trigger a warning plus a deprecation  warning for the very first unhandled rejection in case no unhandledRejection  hook is used.

总结

  • 当进程结束的 exit code 为非 0 时,系统会认为该进程执行失败

  • 通过 echo $? 可查看终端上一进程的 exit code

  • Node 中 Promise.reject 时 exit code 为 0

  • Node 中可以通过 process.exitCode = 1 显式设置 exit code

  • 在 Node12+ 中可以通过 node --unhandled-rejections=strict error.js执行脚本,视  Promise.reject 的 exit code 为 1

上述内容就是Node 中出现脚本遭遇异常时如何安全退出,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网JavaScript频道。

--结束END--

本文标题: Node 中出现脚本遭遇异常时如何安全退出

本文链接: https://lsjlt.com/news/74200.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Node 中出现脚本遭遇异常时如何安全退出
    本篇文章为大家展示了Node 中出现脚本遭遇异常时如何安全退出,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Exit Code什么是 exit codeexit c...
    99+
    2024-04-02
  • linux如何实现当运行失败时使脚本退出
    这篇文章给大家分享的是有关linux如何实现当运行失败时使脚本退出的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。当运行失败时使脚本退出有时即使某些命令运行失败,bash  可能继续去执行脚本,这样就影响...
    99+
    2023-06-27
  • 在springboot中springmvc出现抛出全局异常如何解决
    在springboot中springmvc出现抛出全局异常如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springboot中抛出异常,springbo...
    99+
    2023-05-31
    springboot springmvc 全局异常
  • 如何及时知道redis出现异常
    redis异常排查的方法:redis-server redis.windows.conf示例:D:\redis-2.8.17>redis-server.exe redis.windows.conf[4692] 27 Nov 12:14:05...
    99+
    2024-04-02
  • linux如何实现当Bash用未声明变量时使脚本退出
    小编给大家分享一下linux如何实现当Bash用未声明变量时使脚本退出,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!当 Bash 用未声明变量时使脚本退出Bash 也可能会使用能导致起逻辑错误的未声明的变量。因此用下面行的...
    99+
    2023-06-27
  • Android中跨进程时出现SharedPreferences异常如何解决
    这篇文章将为大家详细讲解有关Android中跨进程时出现SharedPreferences异常如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Android 跨进程SharedPref...
    99+
    2023-05-31
    android 跨进程 sharedpreferences
  • python中出现FileNotFoundError异常如何解决
    本篇文章给大家分享的是有关python中出现FileNotFoundError异常如何解决,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python的五大特点是什么python...
    99+
    2023-06-14
  • 如何写出安全的、基本功能完善的Bash脚本
    每个人或多或少总会碰到要使用并且自己完成编写一个最基础的Bash脚本的情况。真实情况是,没有人会说“哇哦,我喜欢写这些脚本”。所以这也是为什么很少有人在写的时候专注在这些脚本上。 我本身也不是一个Bash脚本专家,但是我...
    99+
    2022-06-04
    安全的bash脚本 功能完善的bash脚本
  • Kafka中如何处理消费者异常退出的情况
    Kafka中处理消费者异常退出的情况通常需要通过配置合适的参数和监控机制来解决。下面是一些常见的处理方法: 使用自动提交偏移量:...
    99+
    2024-04-02
  • java项目中出现异常如何解决
    本篇文章为大家展示了java项目中出现异常如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象...
    99+
    2023-06-14
  • Python中出现异常重试如何解决
    这篇文章给大家介绍Python中出现异常重试如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。原先的流程:def crawl_page(url):     ...
    99+
    2023-06-17
  • HTML5中如何实现video进入全屏和退出全屏
    小编给大家分享一下HTML5中如何实现video进入全屏和退出全屏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!不同的浏览器有不同的实现方法// Web...
    99+
    2023-06-09
  • java项目中Zipexception出现异常如何解决
    本篇文章为大家展示了java项目中Zipexception出现异常如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1 异常描述在从 SVN 检出项目并配置完成后,启动 Tomcat 服务器,报...
    99+
    2023-05-31
    zipexception java ava
  • MySQL存储过程中出现异常如何处理
    下面一起来了解下MySQL存储过程中出现异常如何处理,相信大家看完肯定会受益匪浅,文字在精不在多,希望MySQL存储过程中出现异常如何处理这篇短内容是你想要的。      &n...
    99+
    2024-04-02
  • ASP.NET中App_Code文件夹出现异常如何解决
    本篇文章为大家展示了ASP.NET中App_Code文件夹出现异常如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。新建一个Web Site的操作如下:很简单。网站项目中除了该有的ASPX文件外...
    99+
    2023-06-17
  • 如何解决Python脚本在同步shell索引时出现的错误?
    Python是一种流行的编程语言,它可以帮助程序员快速开发各种应用程序。当开发者在使用Python时,有时候会遇到一些错误,比如在同步shell索引时出现的错误。本文将介绍如何解决Python脚本在同步shell索引时出现的错误。 一、什么...
    99+
    2023-10-27
    同步 shell 索引
  • Win7安全中心出现故障如何解决以保证电脑安全
      Win7系统有一个安全中心,它所涉及到的就是保护我们的电脑安全。如果电脑中的安全中心出现故障而又没有及时处理的话,很有可能就会遭到电脑黑客的攻击。那么如果Win7系统电脑安全中心出现故障,要怎么解决呢?   1.首先...
    99+
    2023-06-16
    Win7 安全中心 电脑 故障 中心
  • 在Rstudio中安装package时出现错误如何解决
    在Rstudio中安装package时出现错误如何解决?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、 install.packages('REmap')无法...
    99+
    2023-06-14
  • PowerDesigner建模后如何实现把sql脚本导出再导入mysql中
    下面讲讲关于PowerDesigner建模后如何实现把sql脚本导出再导入mysql中,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完PowerDesigner建模后如何实现把s...
    99+
    2024-04-02
  • Java项目中出现自动拆箱空指针异常如何解决
    本篇文章给大家分享的是有关Java项目中出现自动拆箱空指针异常如何解决,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的特点有哪些Java的特点有哪些1.Java语言作为...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作