The connection and authentication phases are carried out by the OpenSSH client and it doesn't pass the cause of the failure back to the module.
in reply to Re^6: SSH2 - Asynchronous Opens & Synchronous Commands
in thread SSH2 - Asynchronous Opens & Synchronous Commands
An easy to implement workaround is to redirect the output of the master ssh process to a file and then, to retrieve it when something goes wrong.
my $ssh = Net::OpenSSH->new($host, master_stderr_file => "/tmp/ssh-std
+err-$host", master_opts => ['-v'], ...);