суббота, 19 мая 2012 г.

Try::Tiny и диспетчеризация исключений

Проблема 
Многие используют Try::Tiny. Все в этом модуле хорошо, только не хватает вот чего-то вроде:
try {
   die Class1->new();
}
catch('Class1') {
   # Catch all exceptions of Class1
}
catch('Class2') {
   # Catch all exceptions of Class2
}
catch {
   # Catch other exceptions
}
К сожалению, сделать такой синтаксис, не убрав "::Tiny" с названия модуля, не так просто. Кроме того, переписывать Try::Tiny вообще нет никакого желания.

Решение 1
Немного подумав я пришел к такому варианту:

try {
   die Class1->new();
}
catch {
    when ('Class1') {
        # Catch all exceptions of Class1     
    }
    when ('Class2') {
        # Catch all exceptions of Class1
    }
    default {
       # Catch other exceptions        
    }
}
Чтобы такой синтаксис заработал необходимо перегрузить "~~" ("Smart match") для ваших объектов исключений. Вот пример реализации

Решение 2
Если нет возможности перегрузить "~~", то можно пойти другим путем, добавить некий хелпер, например "e" Важно!!! Нужно помнить, что код после блока "default" не будет выполнен!

0 коммент.:

Отправить комментарий

Не забудьте добавить себя в постоянные читатели и включить уведомления о новых комментариях, либо воспользуйтесь RSS каналом ;)