Как я могу получить структурированные исключения из Moose? - PullRequest
12 голосов
/ 11 февраля 2010

Рассмотрим этот простой класс:

package Foo;
use Moose;
has foo => ( is => 'rw', isa => 'Int' );

А потом этот код:

use Try::Tiny;
use Foo;
my $f = try {
    Foo->new( foo => 'Not an Int' );
}
catch {
    warn $_;
};

Код умирает с красивым большим сообщением об ошибке, когда ограничения типа не выполняются.

Я хотел бы иметь возможность извлечь, какой атрибут не удался (foo), в чем причина (сбой ограничения типа) и какое значение было передано (Not an Int) без необходимости разбора строки ошибки, чтобы получить информация

Примерно так:

catch {
    if( $_->isa( 'MooseX::Exception::TypeConstraint' ) ) {
         my $attrib = $_->attribute;
         my $type   = $_->type;
         my $value  = $_->bad_value;

         warn "'$value' is an illegal value for '$attrib'.  It should be a $type\n"; 
    }
    else {
         warn $_;
    }
};

Возможно ли это? Есть ли дистрибутив MooseX, который может это сделать? Еще лучше, есть ли какая-то функция Moose, которую я пропустил, которая сделает это возможным?

Обновление: Меня особенно интересуют ограничения типов, но другие ошибки Moose также будут очень хорошими. Я также знаю, что могу бросать объекты с die. Итак, структурирование исключений в коде, который я пишу, относительно просто.

Ответы [ 3 ]

4 голосов
/ 11 февраля 2010

Я сам не пробовал, но думаю, MooseX :: Error :: Exception :: Class может быть тем, что вы ищете.

3 голосов
/ 11 февраля 2010

Извлечение MooseX :: Throwable , которое заменяет значение error_class в метаклассе. Однако код выглядит немного старым (metaroles теперь поддерживают роли классов ошибок), но текущий метод выглядит так, как будто он все еще будет работать.

1 голос
/ 16 июня 2011

Около года назад у меня был тот же вопрос, который задавали на IRC-канале #moose. Ответ состоял в том, что Moose на самом деле не поддерживает структурированные исключения .... пока.

Существует общее согласие, что это недостаток Moose, который следует исправить, но задача введения исключений везде утомительна и еще не выполнена (afaik).

Подход в MooseX :: Error :: Exception :: Class очень хрупок, поскольку основан на анализе сообщений от Moose.

Поскольку вы не можете действительно получить надежные структурированные исключения от Moose, рассмотрите возможность использования самоанализа для проверки каждого из ваших ограничений типов по одному при установке нового значения. Иногда такой подход возможен.

Кстати: обратите внимание, что неприятная ошибка в способе Moose обрабатывать составные ограничения .

...