Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling

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.

Replies are listed 'Best First'.
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.

    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
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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://37704]
Approved by root
and !@monks...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (4)
As of 2017-10-20 06:12 GMT
Find Nodes?
    Voting Booth?
    My fridge is mostly full of:

    Results (259 votes). Check out past polls.