Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

END failed--call queue aborted

by Adam (Vicar)
on Oct 20, 2000 at 20:19 UTC ( #37704=perlquestion: print w/ replies, xml ) Need Help??
Adam has asked for the wisdom of the Perl Monks concerning the following question:

How does Perl detect this loop?
perl -we "sub fail {die 'test' }; END{ fail }; fail()" test at -e line 1. test at -e line 1. END failed--call queue aborted.
As you can see, die seems to get called twice, but then Perl determines that it is in an endless loop and stops. This is desirable behaviour, but I was a little surprised that it works... so I figured I would ask around to find out if this is a 'feature' and not just a fluke.

Comment on END failed--call queue aborted
Download Code
Re: END failed--call queue aborted
by chromatic (Archbishop) on Oct 20, 2000 at 20:23 UTC
    I'm pretty sure a die in an END block is fatal, unless it's caught.

    Sure, it's an endless loop. It's just that infinity's pretty short for a dead program.

RE: END failed--call queue aborted
by Adam (Vicar) on Oct 20, 2000 at 20:26 UTC
    It gets more interesting! I thought I would throw a SIG{DIE} in there just to see where the route goes and got a very odd result (note the double S):
    perl -we "sub fail{die 'test'}; END{ print qq'\nF\n'; fail() }; $SIG{__DIE__} = sub{print qq!\nS\n!; fail()}; fail()" S test at -e line 1. F S S test at -e line 1.
    Update

    I like line numbers, so I wrote this up as little program:

    #!perl -w use strict; my $counter = 0; sub fail{ ++$counter; print "$counter: Fail called.\n"; die "DEATH ". +__LINE__ ."\n" } END{ ++$counter; print "$counter: End called.\n"; fail() } $SIG{__DIE__} = sub{ ++$counter; print "$counter: SigDie called.\n"; f +ail() }; fail()
    and the output:
    1: Fail called. 2: SigDie called. 3: Fail called. DEATH 4 4: End called. 5: Fail called. 6: SigDie called. 7: Fail called. 8: SigDie called. 9: Fail called. DEATH 4

      Not exactly, as an END block gets always executed. Even if your script dies a present END block will be executed.
      cite from perlman:perlmod

      An END subroutine is executed as late as possible, that is, after perl has finished running the program and just before the interpreter is being exited, even if it is exiting as a result of a die() function. (But not if it's polymorphing into another program via exec, or being blown out of the water by a signal--you have to trap that yourself (if you can).) You may have multiple END blocks within a file--they will execute in reverse order of definition; that is: last in, first out (LIFO). END blocks are not executed when you run perl with the -c switch, or if compilation fails.


      Have a nice day
      All decision is left to your taste

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://37704]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (7)
As of 2014-07-30 21:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (241 votes), past polls