Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: die or croak

by moritz (Cardinal)
on Aug 09, 2013 at 19:26 UTC ( #1048829=note: print w/ replies, xml ) Need Help??


in reply to die or croak

If you get an exception because you misused the API of a module, you usually want to know where in your the error is, so you're happier when the module called croak().

Of course that concept breaks down when you write a module that uses another module which uses croak() -- the errors will come from your module, not from your module user's code.

In the case of internal errors, modules should use die, or maybe even Carp::confess.

(Oh, and if (as a user) you want to get a backtrace no matter what, use Carp::Always).


Comment on Re: die or croak
Download Code
Re^2: die or croak
by Corion (Pope) on Aug 09, 2013 at 19:28 UTC

    Note that you can exempt your module from croak by setting up @CARP_NOT. That way, your module will be invisible to carp.

      Ahh, that sounds intersting. Can you give some pointers or examples?

      Regards
      McA

        I first had problems understanding the documentation in Carp, but basically the setup is:

        package Foo; use strict; use Carp qw( croak ); sub do_foo { croak "Please don't give arguments to do_foo(), got '@_'" unless 0 == @_; }; package Baz; use strict; sub do_baz { Foo::do_foo( @_ ); }; package Bar; use strict; use vars qw(@CARP_NOT); @CARP_NOT=('Foo'); # we are invisible to Foo sub do_bar { my( $first,@rest )= @_; print "Got '$first', Preparing for foo(@rest)\n"; Foo::do_foo(@rest); }; package main; print "Bar\n"; Bar::do_bar('one'); # does not croak print "do_foo\n"; eval { Foo::do_foo('one','two'); }; print $@; # Please don't give arguments to do_foo(), got 'one two' at tmp.pl lin +e 34. print "do_bar\n"; eval { Bar::do_bar('one','two'); }; print $@; # Please don't give arguments to do_foo(), got 'two' at tmp.pl line 37 +. print "do_baz\n"; eval { Baz::do_baz('one','two'); }; print $@; # Please don't give arguments to do_foo() at tmp.pl line 14.

        Here, the package Bar does not show up as an error location, because it sets itself up to be invisible for all errors raised by Foo. Baz does get raised as the error location in the last call, which may or may not be helpful to the user using Baz.

        For a more elaborate example of this, MozRepl::RemoteObject::Instance has some helper classes for tie-ing scalars, arrays and hashes. But all errors due to operations on these should be transparent to the user and show up in the user code, which is achieved by setting up @CARP_NOT in each of the tied classes so that errors raised in MozRepl::RemoteObject::Instance never show up as originating in the helper class.

Re^2: die or croak
by McA (Curate) on Aug 09, 2013 at 19:35 UTC
    Thank you for the fast reply.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1048829]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (8)
As of 2014-09-16 11:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (13 votes), past polls