http://www.perlmonks.org?node_id=900091


in reply to Re^3: Moose: return null object
in thread Moose: return null object

If you, as core developer, believe that "exceptions are the way to go", why does Moose produce such horrible, unhelpful, Java-style backtraces when dieing? For example when a type constraint is violated, I get about 7 lines of output that contribute nothing to the error cause, and have to combine the first and the last line to make up something that might actually relate to the error at hand:

Q:\>perl -MMoose -e "package Moo;use Moose; has 'foo' => (is => 'ro', +isa => 'Int'); no Moose; package main; my $bar = Moo->new({foo => 'bo +om'});" Attribute (foo) does not pass the type constraint because: Validation +failed for 'Int' failed with value boom at g:/Systeme/tools/pe rl-5.10.0/perl/site/lib/Moose/Meta/Attribute.pm line 774 Moose::Meta::Attribute::_coerce_and_verify('Moose::Meta::Attri +bute=HASH(0x190c5f4)', 'boom', 'Moo=HASH(0x190c934)') called a t g:/Systeme/tools/perl-5.10.0/perl/site/lib/Moose/Meta/Attribute.pm l +ine 428 Moose::Meta::Attribute::initialize_instance_slot('Moose::Meta: +:Attribute=HASH(0x190c5f4)', 'Moose::Meta::Instance=HASH(0x187 145c)', 'Moo=HASH(0x190c934)', 'HASH(0x3ea354)') called at g:/Systeme/ +tools/perl-5.10.0/perl/site/lib/Class/MOP/Class.pm line 365 Class::MOP::Class::_construct_instance('Moose::Meta::Class=HAS +H(0x187104c)', 'HASH(0x3ea354)') called at g:/Systeme/tools/pe rl-5.10.0/perl/site/lib/Class/MOP/Class.pm line 352 Class::MOP::Class::new_object('Moose::Meta::Class=HASH(0x18710 +4c)', 'HASH(0x3ea354)') called at g:/Systeme/tools/perl-5.10.0 /perl/site/lib/Moose/Meta/Class.pm line 205 Moose::Meta::Class::new_object('Moose::Meta::Class=HASH(0x1871 +04c)', 'HASH(0x3ea354)') called at g:/Systeme/tools/perl-5.10. 0/perl/site/lib/Moose/Object.pm line 25 Moose::Object::new('Moo', 'HASH(0x12ca3ec)') called at -e line + 1

If you think something is a good engineering practice when using your tool, wouldn't it be a good idea to design your tool in a way that your tool encourages the practice instead of hindering it? Sending the programmer on a merry chase along exception paths is not friendly to the programmer.

If you use one of the standard exception mechanisms, like for example Carp, judicious use of @CARP_NOT can slim down the backtrace tree easily. Also, either passing down the (top-level) error cause to the place where the error gets detected will improve the feedback instead of requiring the programmer to intuit the error cause from the message(s) they get.

Replies are listed 'Best First'.
Re^5: Moose: return null object
by stvn (Monsignor) on Apr 19, 2011 at 12:18 UTC

    There seems to be no consensus on stack traces. Personally I find them very useful, you obviously differ in that opinion but still do see some usefulness, while others think they are simply evil incarnate.

    To be honest, I wanted originally to use exception objects, but so many people/tools/programs expect die to throw a string and so many existing exception-object modules jumped through so many hoops it just turned me off from the idea. That said, these days I use Throwable and love it.

    If you use one of the standard exception mechanisms, like for example Carp, judicious use of @CARP_NOT can slim down the backtrace tree easily

    Moose does use Carp actually.

    I will the first to admit (and I suspect many of the other core devs would agree) that Moose could use some better errors. There are few modules out there that couldn't use some help with errors, it is all too common to leave them till the end. Any help you would like to provide, I am sure would be greatly appreciated.

    -stvn

      I'm not actively using Moose except for one toy project. It's thus highly unlikely that I'll try to undertake the augeian task of modifying the layers upon layers of abstraction just to try to make the world better for people who won't appreciate my work.