🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.perl
Article #82

$SIG{__DIE__} - przestroga

#82
From: Piotr Piatkowski
Date: Fri, 31 Jan 1997 16:53
37 lines
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!news

Show 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