in reply to INIT {$SIG{__DIE__} and Getopt::Long

Okay, then ... instead of using die(), why not print STDERR your usage instructions?

STDERR is a “second output-stream” that is specifically intended for error-messages, and for any other program output that is not “standard output.”

I believe that it is customary for “usage” information to be directed to this file-handle anyway.   It normally outputs to the terminal as STDOUT does, but it can be redirected separately.   (In a Unix/Linux shell, it is redirected by means of 2> ...)

And, in any case, if you need to output to a LOG file-handle within an exception handler, you will need to ensure that the file is open before an exception could possibly be trapped, or have the exception-handler open it on-demand.