The only portable way to do this is, is to call the code via eval, and wrap that in a guard.
Eg:
(define (safe-eval code env)
(guard [e [(syntax-violation? e) (display e)]]
(eval code env)))
Usage:
> (safe-eval '(let a v) (environment '(rnrs)))
&who: let
&message: "invalid syntax"
&syntax:
form: (let a v)
subform: #f