xem xét lớp đơn giản này:Làm cách nào để có được ngoại lệ có cấu trúc từ Moose?
package Foo;
use Moose;
has foo => (is => 'rw', isa => 'Int');
Và sau đó mã này:
use Try::Tiny;
use Foo;
my $f = try {
Foo->new(foo => 'Not an Int');
}
catch {
warn $_;
};
Mã này chết với một thông báo lỗi lớn tốt đẹp về kiểu hạn chế thất bại.
Tôi muốn có thể trích xuất thuộc tính nào không thành công (foo
), lý do là gì (hạn chế loại không thành công) và giá trị đã vượt qua là (Not an Int
) mà không phải phân tích chuỗi lỗi để nhận thông tin.
Something như thế này:
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 $_;
}
};
Đây có phải là có thể? Có bản phân phối MooseX nào có thể thực hiện điều này không? Tốt hơn, có một số tính năng Moose mà tôi bỏ lỡ mà sẽ làm cho điều này có thể?
Cập nhật: Tôi đặc biệt quan tâm đến các ràng buộc về loại, nhưng các lỗi Moose khác cũng rất tốt. Tôi cũng biết rằng tôi có thể ném các đối tượng với die
. Vì vậy, cấu trúc ngoại lệ trong mã tôi viết là tương đối dễ dàng.
Điều này rất thú vị.Nó hoạt động như MooseX :: Throwable nhưng được xây dựng trên Exception :: Class và định nghĩa sự khởi đầu của một hệ thống phân cấp lớp ngoại lệ. Bên trong, nó phân tích cú pháp thông báo lỗi để xác định loại ngoại lệ nào để ném. – daotoad
Thật không may nó đã không được cập nhật trong một thời gian, và không kiểm tra của nó khá nhiều ở khắp mọi nơi. –