in reply to Re^5: Net::SSH2 test connection to remote host
in thread Net::SSH2 test connection to remote host
That's the reason you cannot trust $@ to be set if, and only if, the eval failed.
Here's an example.
Now we change the code by adding some DESTROY methods - and note that this is the only change in the code.#!/usr/bin/perl use 5.010; use strict; use warnings; use Test::More tests => 3; eval {my $x = bless [], 'one'}; is $@, ""; eval {my $x = bless [], 'two'}; is $@, ""; eval {my $x = bless [], 'three'; die "foo\n";}; is $@, "foo\n"; __END__ 1..3 ok 1 ok 2 ok 3
As you can see, after the second eval $@ is set where you don't expect it to be (the eval succeeded), and while the third eval died, $@ is false.#!/usr/bin/perl use 5.010; use strict; use warnings; use Test::More tests => 3; eval {my $x = bless [], 'one'}; is $@, ""; eval {my $x = bless [], 'two'}; is $@, ""; eval {my $x = bless [], 'three'; die "foo\n";}; is $@, "foo\n"; sub one::DESTROY {1;} sub two::DESTROY {$@ = "foo";} sub three::DESTROY {$@ = "";} __END__ 1..3 ok 1 not ok 2 # Failed test at /tmp/test line 11. # got: 'foo' # expected: '' not ok 3 # Failed test at /tmp/test line 12. # got: '' # expected: 'foo # ' # Looks like you failed 2 tests of 3.
And note that while I did direct assignment to $@ in the DESTROY methods, I could also have used evals in the DESTROY methods to create false positive or negatives.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^7: Net::SSH2 test connection to remote host
by salva (Canon) on Oct 01, 2008 at 07:36 UTC | |
by JavaFan (Canon) on Oct 01, 2008 at 09:44 UTC | |
by salva (Canon) on Oct 01, 2008 at 10:30 UTC |