Actually, the solution I came upon was to
carp using redirection, reset STDERR to its original destination, and then
croak. That way the log gets written before dying, and anything that causes failure also gets written to the terminal (if it's not redirected by the shell).
Thanks everyone for the suggestions, though.