die LIST
Eval
išorėje, išspausdina LIST reikšmę į STDERR
ir išeina su dabartine $!
reikšme(errno). Jei $!
yra 0
, baigia darbą su ($?>> 8)
reikšme (backtick `command` statusas). Jei ($?>> 8)
yra 0
, baigia darbą su 255
.Eval()
viduje, klaidos pranešimas yra sutalpinamas į $@
ir eval
nutraukiamas su neapibrėžta reikšme. Taip vykdomas die
su išimtimi.
Tolygūs pavyzdžiai:
die "Can't cd to spool: $!\n" unless chdir '/usr/spool/news';
chdir '/usr/spool/news' or die "Can't cd to spool: $!\n"
Jei pirmasis LIST elementas nesibaigia naujoje eilutėje, vykdomo skripto eilutės numeris ir įvesties eilutės numeris (jei toks yra) taip pat išvedami ir pateikiama nauja eilutė. Įsidėmėkite, kad "įvesties eilutės numeris" (taip pat vadinamas "chunk") linkęs į bet kokį eilutės traktavimą, kuris šiuo metu yra efektyvus bei taip pat galimas pasiekti per specialųjį kintąmąjį $.
. Taip pat "$/" perlvar ir "$." perlvar.
Patarimas: kartais prijuntiant ",
stopped"
prie pranešimo leis geriau suprasti pranešimą su pridėtu "at foo line 123"
. Tarkim vykdomas skriptas "canasta".
die "/etc/games is no good";
die "/etc/games is no good, stopped";
rezultatai, atitinkamai
/etc/games is no good at canasta line 123.
/etc/games is no good, stopped at canasta line 123.
Taip pat žiūrėti exit(), warn() ir Carp modulį.
Jei LIST tuščias, o $@
jau turi reikšmę (dažniausiai iš praeito sulyginimo), ta reikšmė naudojama vėl, po to, kai pridedama "\t...propagated"
. Tai naudinga perduodant išimtis:
eval { ... };
die unless $@ =~ /Tikėtina išimtis/;
Jei LIST tuščias, o $@
yra nuoroda į obejktą, kuri turi PROPAGATE
metodą, tas metodas bus iškviestas su atitinkamais failo ir eilutės numerio parametrais. Gražinama reikšmė perrašo reikšmę $@
. t.y. tarsi $@ = eval { $@->PROPAGATE(__FILE__, __LINE__) };
būtų iškviesta.
Jei $@
tuščias, tai naudojamas string'as "Died"
.
die() taip pat gali būti iškviestas su nuorodos argumentu. Jei šis pakliūna į eval(), nuoroda yra $@. Toks elgesys leidžia gudresnį išimčių handling'ą naudojant objektus, kurie turi sutartinį statusą kalbant apie exceptions'us. Tokia schema kartais priimtina, kad atitiktų tam tikras $@ stringų reikšmes naudojant regexp'ą. Štai pavyzdys:
eval { ... ; die Some::Module::Exception->new( FOO => "bar" ) };
if ($@) {
if (ref($@) && UNIVERSAL::isa($@,"Some::Module::Exception")) {
# Some::Module::Exception
}
else {
# visi kiti exception'ai
}
}
Kadangi perlas nepagautas exception žinutes pavers į stringus prieš jas parodant, gali būti norima perleisti tokiems objektams vertimo į stringus operacijas. Žiūrėti overload dėl detalesnės informacijos.
Galima padaryti, kad callback'as būtų paleistas prieš pat die
atliekant savo darbą, užsetinant $SIG{__DIE__}
. Susietas handler'is bus iškviestas su klaidos tekstu ir gali pakeisti klaidos žinutę, jei jis atrodo geras, iškviečiant die
vėl. Plačiau "$SIG{expr}"
perlvar dėl detalių, nustatant %SIG
įvestis ir eval BLOCK pavyzdžius. Nors ši savybė buvo numatyta, kad bus paleista prieš pat baigiant programai savo darbą, tačiau šis atvejis ne toks - $SIG{__DIE__}
dabar iškviečiamas viduje eval() blockų/strings'ų! Jei kas nori, kad tokiomis situacijomis nieko nevyktų, tereikia įterpti
die @_ if $^S;
kaip pirmą handler'io eilutę (žr. "$^S" perlvar).
Kadangi tai atlieka gan keistus veiksmus, šis visiškai neintuityvus veikimas gali būti ateities leidimuose ištaisytas.