Всем привет,
решил тут покрасивше сделать обработку исключений, бегло глянул - полно
модулей которые делают джаваподобный синтаксис, но честно говоря нет
желания глубоко в них вникать, предполагаю что у всех у них могут быть
проблемы как например у 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

Ответить