Thread View: pl.comp.lang.perl
1 messages
1 total messages
Started by Piotr Piatkowski
Fri, 31 Jan 1997 16:53
$SIG{__DIE__} - przestroga
Author: 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
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads