|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 08 Jul 2003 18:44:11 To : Dmitry Grebeniuk Subject : Re: обработка вложенных исключительных ситуаций -------------------------------------------------------------------------------- Хмутро. DG> hi, All DG> Хочется сделать обработку вложенных исключительных ситуаций и их передачу DG> наподобие такого: DG> { DG> local $SIG{'__DIE__') = sub { print "exc: $@" }; DG> { DG> F = open "< file" or die "file open error: $!"; DG> my $cleanup = sub { close F }; DG> my $exception_handler = sub { &$cleanup; die "$@ (after cleanup)"; }; DG> local $SIG{'__DIE__') = $exception_handler; DG> # работа с F, где может встретиться исключительная ситуация: DG> die "file exception"; DG> # DG> &$cleanup; DG> }; DG> }; DG> (пример с файлами совершенно условен) DG> Конечно же, сия наивность не прокатит - в момент внутреннего die() DG> $SIG{__DIE__} указывает на $exception_handler. DG> Придумалось решение - обернуть внутреннюю функцию в eval { block }, после DG> которого написать DG> die "$@ (re-raised)" if $@; DG> , но это не очень красиво, имхо. Можно ли без eval добиться подобного DG> поведения - передачи исключительной ситуации "наверх" изнутри обработчика? DG> К примеру, в C++, не к ночи будет помянут, это делается простым оператором DG> throw без аргументов... А в perl это делается простым оборачиванием всего скрипта в eval { block } и забыванием про существование $SIG{__DIE__}. Аналога $SIG{__DIE__} в C++ вообще не существует. -- Artem Chuprina RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/122.256, ICQ: 13038757 --- ifmail v.2.15dev5 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/1147753dee433.html, оценка из 5, голосов 10
|