I think I'm seeing a gambit bug. I have a situation where this returns #f: (with-exception-handler (lambda (e) #t) (lambda () (trampoline-gp-set! (make-trampoline) 6 99) #f)) And this returns #t: (with-exception-catcher (lambda (e) #t) (lambda () (trampoline-gp-set! (make-trampoline) 6 99) #f)) And running this from the repl raises: (trampoline-gp-set! (make-trampoline) 6 99) The definition of trampoline-gp-set! is currently: (define trampoline-gp-set!/internal (c-lambda (trampoline int unsigned-int64) void "___arg1->gp[___arg2] = ___arg3;")) (define (trampoline-gp-set! trampoline index value) (if (>= index 6) (raise "invalid index for trampoline-gp-set!")) (trampoline-gp-set!/internal trampoline index value)) But all this happens with this definition as well: (define trampoline-gp-set! (c-lambda (trampoline int unsigned-int64) void #<<END_OF_C_LAMBDA if (___arg2 >= 6) ___err = ___FIX(___UNKNOWN_ERR); else ___arg1->gp[___arg2] = ___arg3; END_OF_C_LAMBDA )) Am I missing something? I'm using WITH-EXCEPTION-HANDLER elsewhere to do the same thing and it appears to be working there.