Executing this code on guile-3.0.0: (dynamic-wind (lambda () (pk 'enter)) (lambda () (catch #t (lambda () (throw 1)) (lambda x (pk 'catch x) (apply throw x)))) (lambda () (pk 'leave))) Leads to the output: scheme@(guile-user)> (load "bug.scm") ;;; (enter) ;;; (catch (a)) ice-9/boot-9.scm:1669:16: In procedure raise-exception: Throw to key `a' with args `()'. What, it does not execute the leave part of the dynamic wind. This works however, (catch #t (lambda () (dynamic-wind (lambda () (pk 'enter)) (lambda () (catch #t (lambda () (throw 'a)) (lambda x (pk 'catch x) (apply throw x)))) (lambda () (pk 'leave)))) (lambda x #f)) So is this how it should be?