Всем привет, решил тут покрасивше сделать обработку исключений, бегло глянул - полно модулей которые делают джаваподобный синтаксис, но честно говоря нет желания глубоко в них вникать, предполагаю что у всех у них могут быть проблемы как например у 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 mailing list
[email protected] | http://moscow.pm.org
