We were reviewing the following code for part of a membership site I've been working on when another developer pointed out that I used a goto and this was evil. The code is:
RE_TIE: eval { tie %session, 'Apache::Session::MySQL', $session, { Handle => HH::DB->db_Main, LockHandle => HH::DB->db_Main } }; if ($@) { if ($@ =~ /^Object does not exist/) { $session = undef; goto RE_TIE; } else { print $cgi->header; die_nice('Database Error', 'Unable to connect at this time'); } }
The goto is to handle a "shouldn't really happen" case (somebody sending us a session id which is invalid). I like the use of goto because it doesn't distract from the "normal" case which a loop would. He suggested:
my $tied = 0; while (!$tied) { eval { tie %session, 'Apache::Session::MySQL', $session, { Handle => HH::DB->db_Main, LockHandle => HH::DB->db_Main }; if ($@) { if ($@ =~ /^Object does not exist/) { $session = undef; } else { print $cgi->header; die_nice('Database Error', 'Unable to connect at this time +'); } } else { $tied = 1; } }
Personally I think this is harder to read and it makes you read through to work out how the loop is exited.
I was wondering what the general consensus here was, is goto (in this case) really evil?
gav^
Back to
Meditations