- Version: v4.8.7, v6.12.3, v8.11.0, v9.11.1
- Platform: MacOS 10.13.4
- Subsystem: Timers
I have an uncaughtException handler which performs asynchronous cleanup. This cleanup may only take a certain amount of time, after which the process is forcibly exited. This time limitation is implemented through an unreferenced setTimeout.
If an uncaught exception is thrown from inside another timer, then my cleanup timeout fires instantly.
Here's a reproduction:
'use strict'
process.on('uncaughtException', err => {
console.error('caught exception', err)
let start = Date.now()
const timer = setTimeout(() => {
console.error('timeout duration %sms', Date.now() - start)
}, 1000).unref()
console.error('created timer')
})
setTimeout(() => {
throw new Error('trigger')
}, 1000)
setTimeout(() => {}, 5000) // keep process alive
$ node test.js
caught exception Error: trigger
at Timeout.setTimeout [as _onTimeout] (/private/var/folders/2_/qczp184x76b2nl034sq5hvxw0000gn/T/tmp.iAigvol9mj/test.js:12:9)
at ontimeout (timers.js:466:11)
at tryOnTimeout (timers.js:304:5)
at Timer.listOnTimeout (timers.js:267:5)
created timer
timeout duration 2ms
The behavior is as expected when the timer is not unreferenced.