91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node 中出現腳本遭遇異常時如何安全退出

發布時間:2021-07-21 09:30:46 來源:億速云 閱讀:170 作者:Leah 欄目:web開發

本篇文章為大家展示了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 中出現腳本遭遇異常時如何安全退出,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肇庆市| 抚宁县| 高阳县| 抚顺市| 如皋市| 涿州市| 正安县| 海阳市| 司法| 大悟县| 无锡市| 普定县| 安平县| 商丘市| 和硕县| 同江市| 荥经县| 无锡市| 浦城县| 郓城县| 潍坊市| 金堂县| 永宁县| 扎赉特旗| 神农架林区| 嘉禾县| 罗田县| 莒南县| 太原市| 思南县| 龙泉市| 宁城县| 腾冲县| 马鞍山市| 宁晋县| 长宁县| 德阳市| 潞城市| 仁化县| 湟源县| 台州市|