[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