即使抛出错误,异步函数也会以代码 0 退出
Async function does exit with code 0 even if error was thrown
有谁知道在抛出错误时如何使异步函数以非零退出代码退出?
如果同步函数抛出错误,NodeJS 脚本将退出并显示错误代码:
sync.js:
'use strict'
const main = function () {
throw Error('Something failed hard')
}
main()
$ node sync.js
> ... Error: Something failed hard ...
$ echo $?
> 130
但是如果我对异步函数做同样的事情,错误代码总是0
:
async.js:
'use strict'
const main = async function () {
throw Error('Something failed hard')
}
main()
$ node async.js
> ... UnhandledPromiseRejectionWarning: Error: Something failed hard ...
$ echo $?
> 0
我能做的最接近的事情是:
async2.js:
'use strict'
const main = async function () {
process.exit(1)
throw Error('Something failed hard')
}
main()
$ node async2.js
$ echo $?
> 1
但是由于脚本已经退出,因此不会抛出错误:-P
我正在使用节点 12.8.3。
我猜脚本不会等到 promise 被拒绝后才退出。但是我不知道如何让异步函数等待,因为我不能在函数之外使用 await
:-P
我发现您不需要使用 process.exit(<code>)
但您可以使用 process.exitCode = <code>
.
设置脚本退出时将使用的退出代码
所以这有效:
async3.js:
'use strict'
const main = async function () {
process.exitCode = 1
throw Error('Something failed hard')
}
main()
$ node async3.js
> ... UnhandledPromiseRejectionWarning: Error: Something failed hard ...
$ echo $?
> 1
谢谢大家做我的橡皮鸭!
我认为使用异步函数时状态代码为 0 的原因是抛出异步方法会引发 Promise 拒绝,但严格意义上它不会抛出。错误包含在 Promise 拒绝中,这可能被认为是常规执行,毕竟这是有道理的,因此是成功状态代码。
有谁知道在抛出错误时如何使异步函数以非零退出代码退出?
如果同步函数抛出错误,NodeJS 脚本将退出并显示错误代码:
sync.js:
'use strict'
const main = function () {
throw Error('Something failed hard')
}
main()
$ node sync.js
> ... Error: Something failed hard ...
$ echo $?
> 130
但是如果我对异步函数做同样的事情,错误代码总是0
:
async.js:
'use strict'
const main = async function () {
throw Error('Something failed hard')
}
main()
$ node async.js
> ... UnhandledPromiseRejectionWarning: Error: Something failed hard ...
$ echo $?
> 0
我能做的最接近的事情是:
async2.js:
'use strict'
const main = async function () {
process.exit(1)
throw Error('Something failed hard')
}
main()
$ node async2.js
$ echo $?
> 1
但是由于脚本已经退出,因此不会抛出错误:-P
我正在使用节点 12.8.3。
我猜脚本不会等到 promise 被拒绝后才退出。但是我不知道如何让异步函数等待,因为我不能在函数之外使用 await
:-P
我发现您不需要使用 process.exit(<code>)
但您可以使用 process.exitCode = <code>
.
所以这有效:
async3.js:
'use strict'
const main = async function () {
process.exitCode = 1
throw Error('Something failed hard')
}
main()
$ node async3.js
> ... UnhandledPromiseRejectionWarning: Error: Something failed hard ...
$ echo $?
> 1
谢谢大家做我的橡皮鸭!
我认为使用异步函数时状态代码为 0 的原因是抛出异步方法会引发 Promise 拒绝,但严格意义上它不会抛出。错误包含在 Promise 拒绝中,这可能被认为是常规执行,毕竟这是有道理的,因此是成功状态代码。