The odd behavior of variables inexplicably "rolling back" to a previous
value was repeatable the other day.  I did further debugging today (nothing
except adding print statements), and it is now behaving as expected.  I
have no explanation for it.

The set_die_handler is still being called twice.  I stopped the second one
from processing, but I'm still curious why/how it is being called twice.
 My Google foo is weak on finding any explanation for it.

Paul


On Tue, Mar 18, 2014 at 6:55 PM, Paul Boniol <[email protected]> wrote:

> I've got some really weird behavior out of Perl in my error handling...
>
>    - My warning/error subroutine (sub PrintError) gets values from the
>    caller and copies them to local variables (my).
>    - If they have certain values, I change some of these local variables.
>    - I display the new values to the browser.  They are the new values.
>    - I set global variables to the value of these local variables.  (The
>    only place these global variables are set.)
>    - I call confess();
>    - It calls my handle_errors subroutine.  (All sounds good so far,
>    right?)
>    - The global variables now have the ORIGINAL local values, before I
>    changed them...?
>
> There are no additional my variables defined later in PrintError.
>
> I don't get it.
>
> I copied the if statement and block from the PrintError into my
> set_die_handler (only change is to set the global variables).  And it is
> "fixed".  How could it get the original values?
>
> (I'm also getting 2 emails for each error... The only difference is one
> $msg has the date-time stamp and the other doesn't.  I'd rather not get
> two, but it is ok.)
>
> It "works".... I'm just confused as to why I'm getting older values and
> have to repeat the if.
>
> Code follows:
>
> $sth->execute($StudentID) or PrintError ('Database error executing
> statement 1.', $sth->errstr, 1, \$HeadOpen, 1);
>
>
>
> sub PrintError {
>     # All variable names here are unique within the program.
>     my ($Message, $Message2, $Die, $HeadOpenRef, $MySendEmail) = @_;
>     if (!defined $Message2) {
>         $Message2 = '';
>     }
>
>     if ($Message eq 'Database error executing statement 1.' && # This is
> the block that changes values
>         $Message2 =~ m/String data, right truncation/) {
>         $Message = 'ID was too long.';
>         $MySendEmail = 0;  # Don't email me!
>     }
>
>     if (${$HeadOpenRef}) {
>         print '<meta http-equiv="REFRESH" content="15; URL=', $retadr,
>               '"></head><body>';
>         ${$HeadOpenRef} = 0;
>         HSNGSANDDB->headclose();
>     }
>     print ('<h1>', $Message, '</h1><br>');  # It prints the new value
>     if ($Message2) {
>         print ($Message2, '<br>');
>     }
>     if ($Die) {
>         #print ('SendEmail = ' . $MySendEmail . '<br>');
>         print ('</body></html>');
>         $ErrorLineNumber = (caller())[2];
>         $SendEmail = $MySendEmail;   # These three lines are the ONLY
> places these global variables are set.
>         $gMessage  = $Message;          #
>         $gMessage2 = $Message2;       #
>         open STDERR, '>', File::Spec->devnull();
>         confess ();
>     }
> }
>
>
>     sub handle_errors {
>         my $msg = shift;
>         if ($SendEmail) {  # Has original value
>             my %mail = (
>                 Smtp => myserver,
>                 To => myemail,
>                 From => myemail,
>                 Subject => 'Error in PrintAContract',
>             );
>             $mail{Message} = 'Line number: ' . $ErrorLineNumber . "\n";
>             $mail{Message} .= 'Message = ' .   $gMessage .  "\n"   if
> (defined $gMessage);
>             $mail{Message} .= 'Message2 = ' .  $gMessage2 . "\n"   if
> (defined $gMessage2);
>             $mail{Message} .= "\n" . $msg if (defined $msg);
>             sendmail(%mail) or print $Mail::Sendmail::error;
>         }
>     }
>     set_die_handler(\&handle_errors);
>
> $SendEmail, $gMessage, and $gMessage2 have old values when handle_errors
> is run.  The original values are in the email that gets sent...
>

-- 
-- 
You received this message because you are subscribed to the Google Groups 
"NLUG" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nlug-talk?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"NLUG" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to