_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/die - išveda pranešimą arba praleidžia
  • die LIST

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

algirdas@perl.lt 2005.04.11 - $dabar