[Moscow.pm] Обработка исключений
Alexey Shrub
worldmind на mail.ru
Чт Фев 10 01:01:49 PST 2011
Всем привет,
решил тут покрасивше сделать обработку исключений, бегло глянул - полно
модулей которые делают джаваподобный синтаксис, но честно говоря нет
желания глубоко в них вникать, предполагаю что у всех у них могут быть
проблемы как например у Error.pm - появляются замыкания там где их никто
не ждёт
http://axkit.org/docs/presentations/tpc2001/exceptions.axp/a.pdf
понятное дело что он работает в куче проектов, справляются как-то, но
нет желания выискивать проблемы возникшие из-за подобных вещей (хотя
Try::Tiny возможно неплохой вариант - юзал кто?).
Поэтому решил использовать чисто перловый синтаксис и нарисовал такую
конструкцию:
use strict;
use feature ':5.10';
use Carp;
use ExceptionTest;
my $obj = new ExceptionTest();
eval {
$obj->function1();
1;
} or do { given( $@ ) {
when ( $_->isa('Exception::XML') ) {
say 'XML error';
}
when ( $_->isa('Exception::HTTP') ) {
say 'HTTP error';
}
default { croak 'Unknown error: '.$_ }
}}
в методе function1 исключения генерятся так (объекты исключений
самописные для примера)
die new Exception::HTTP( code => 404, message => 'Not Found' );
В многопоточной среде видимо нужно ещё в один блок заворачивать и
локализовать в нём $@, но тогда совсем уродливо будет
С точки зрения синтаксиса не идеально, к сожалению не работает без do
т.е. хотелось бы иметь вместо
} or do { given( $@ )
} or given( $@ )
тогда синтаксил был бы чище, но не получается, получаю синтаксическую
ошибку - не понимаю почему, может кто знает?
Подробная информация о списке рассылки Moscow-pm