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.