Article View: pl.comp.lang.perl
Article #82$SIG{__DIE__} - przestroga
From: Piotr Piatkowski
Date: Fri, 31 Jan 1997 16:53
Date: Fri, 31 Jan 1997 16:53
37 lines
2397 bytes
2397 bytes
Wczoraj straciłem cały dzień przez głupi błąd, więc pomyślałem że się
podzielę z innymi doświadczeniami. Otóż - pisuję różne CGI, więc
ustawiłem sobie handler do __DIE__, żeby w razie błędu (lub jawnego
die) wyświetlił mi ładny, sformatowany w HTML komunikat błędu oraz
stack-trace (coś jak Carp::Croak). Działa to pięknie, wyłapuje
wszystkie błędy typu wywołanie niezdefiniowanej funkcji, etc... Ale!
Zainstalowałem sobie parę modułów z CPAN, i tu nagle w pewnym miejscu
pojawił się problem - program wysypywał się z błędem mówiącym że
Autoloader nie może znaleźć modułu DESTROY.al do jednego z obiektów
(bodajże Mail::Entity). Przeszukałem starannie - ani w tym module,
ani w żadnym nadrzędnym, funkcji DESTROY nie było. Po wielu godzinach
kombinowania wreszcie doszedłem do tego co było przyczyną błędu.
Otóż, ustawienie $SIG{__DIE__} powoduje wywołanie handlera w
przypadku każdego błędu lub wywołania die, zarówno w normalnym
programie jak i - uwaga - wewnątrz funkcji eval! Funkcja ta jednak
często jest używana żeby właśnie uniknąć fatal-error, i tak właśnie
dzieje się w module Autoloader. Mówiąc krótko - żeby uniknąć tego
typu niespodzianek że nagle coś przestaje działać, należy deklarująć
własny handler do __DIE__ koniecznie sprawdzić czy nie jesteśmy
wywołani z wnętrza eval i w takim wypadku zrobić return. Np. tak:
sub die_handler {
my $sub;
(undef, undef, undef, $sub) = caller(1);
return if $sub eq "(eval)";
# właściwa obsługa ...
}
No to tyle. Mam nadzieję że może to komuś zaoszczędzić trochę czasu i
nerwów, które ja wczoraj straciłem :-)
--
Piotr Piątkowski, Uczelniane Centrum Informatyki, AGH Krakow, POLAND
Technical Details
Message-ID:
<5ct81q$mn1@galaxy.uci.agh.edu.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!uw.edu.pl!galaxy.uci.agh.edu.pl!galaxy.uci.agh.edu.pl!newsShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!uw.edu.pl!galaxy.uci.agh.edu.pl!galaxy.uci.agh.edu.pl!news
From: kompas@galaxy.uci.agh.edu.pl (Piotr Piatkowski)
Newsgroups: pl.comp.lang.perl
Subject: $SIG{__DIE__} - przestroga
Date: 31 Jan 1997 17:53:14 +0100
Organization: University of Mining & Metallurgy
Lines: 37
Message-ID: <5ct81q$mn1@galaxy.uci.agh.edu.pl>
NNTP-Posting-Host: galaxy.uci.agh.edu.pl
Mime-Version: 1.0
X-Newsreader: TIN [UNIX 1.3 unoff BETA release 960713]
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit