don't use try/catch directly. use or-nil macro