🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
1 messages
1 total messages Started by Piotr Piatkowski Fri, 31 Jan 1997 16:53
$SIG{__DIE__} - przestroga
#82
Author: 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
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