4 Stimmen

Wie kann ich sicherstellen, dass mein Code niemals direkt beendet wird?

eval{
   require $file;
}

/*subsequent code goes here*/
...

Si $file enthält eine exit Anweisung, hat der nachfolgende Code keine Chance zu laufen.

Wie kann man das Problem umgehen, so dass der nachfolgende Code immer eine Chance hat, ausgeführt zu werden, wenn eval erledigt ist?

4voto

Eugene Yarmash Punkte 130008

Es ist nicht möglich, den Vorgang abzubrechen exit anrufen. $file verwenden sollten die statt, die durch eine eval .

Als Abhilfe können Sie die Option exit global eingebaut:

BEGIN {
    *CORE::GLOBAL::exit = sub { die "About to exit" } 
}

1voto

Gilbert Punkte 3445

Ich habe das nicht gemacht, aber vielleicht können Sie die Perl-Funktion Ausgang Funktion mit Ihrer eigenen, die ein die() einer Nachricht, die Ihr Hauptcode kennt, ausführt. Sie würden dann CORE::exit() verwenden, wenn ich mich erinnere, um einen echten Ausgang zu erhalten.

Besser wäre es, den neuen Code in einem anderen Paket als main:: auszuführen, um main::s exit nicht zu beschädigen.

2011-Aug-06 update: Aus Jux und Dollerei habe ich es ausprobiert:

my $code = qq\[print qq(hello exit 99\\n); exit 99;\];  

{
  package Foo; 
  local $@;
  use vars qw(\*exit);   #required
  local \*exit = sub { die "TRAPPED EXIT: @\_\\n"; };  #override local to package Foo;
  print "doing eval\\n"; 
  eval $code; 
  print "reason=$@\\n";
}

print "done\\n";       #prove we did not truly exit
exit 2;               #set specific exit code

Und ja, Safe.pm ist gut für nicht vertrauenswürdigen Code, aber wenn der Code vertrauenswürdig ist, ist dies einfacher.

perl exit.pl; echo $?
doing eval
hello exit 99
reason=TRAPPED EXIT: 99
done
2

1voto

ErikR Punkte 50915

Werfen Sie einen Blick auf die Safe.pm Modul. Es ermöglicht die Einschränkung, welche Operatoren ausgeführt werden können. Es ist für Situationen gedacht, in denen Sie nicht vertrauenswürdigen Code ausführen müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X