Open
Description
Nim Version
Both
Nim Compiler Version 2.2.4 [Linux: amd64]
Compiled at 2025-04-22
Copyright (c) 2006-2025 by Andreas Rumpf
git hash: f7145dd26efeeeb6eeae6fff64
and
Nim Compiler Version 2.3.1 [Linux: amd64]
Compiled at 2025-06-01
Copyright (c) 2006-2025 by Andreas Rumpf
git hash: 807840dc5bda1e6e218be24d704efb77421e0ccb
active boot switches: -d:release
Description
Here is an example
import std/asyncdispatch
proc doStuff {.async.} =
defer:
for i in 0..<3:
# doesnt work
try:
await sleepAsync(10)
except:
discard
# works as intended
# await sleepAsync(10)
echo "bbb", i
for i in 0..<3:
try:
await sleepAsync(10)
except:
discard
echo "aaa", i
raise newException(CatchableError, "")
proc main() {.async.} =
try:
await doStuff()
except:
echo "err"
waitFor main()
Current Output
aaa0
aaa1
aaa2
err
Expected Output
aaa0
aaa1
aaa2
bbb0
bbb1
bbb2
err
Known Workarounds
In the code above, removing the try-except
and leaving just await
gives expected behavior.
Additional Information
If the defer block is not triggered by an exception, the program also works as intended.