in reply to Argument stringification in __WARN__ and __DIE__

Except the following happens
Indeed, I've lamented this in Any last words?. The problem is due to the fact that the __DIE__ signal handler (and all signal handlers for that matter) only expect one argument, so if you ever pass more than one arg to die perl automagically concatenates the arguments. There is one way around it, but it is rather hackish - set $@ to an object and that will be passed to your $SIG{__DIE__} handler (consult the die docs for more info on this behaviour) e.g
use overload q[""] => sub { "@{$_[0]}" }, fallback => 0; $SIG{__DIE__} = sub { print "dang - ", @{$_[0]}, $/ }; $@ = bless [qw/that didn't work/]; die; __output__ dang - thatdidn'twork that didn't work
Terrifically hackish, but it works ;)
HTH

_________
broquaint

Replies are listed 'Best First'.
Re: Re: Argument stringification in __WARN__ and __DIE__
by Rhandom (Curate) on May 14, 2003 at 22:06 UTC
    Thanks for the reply.
    That could almost be workable. Also I could also do:
    die ["Some error happened", {other => 'args'}];


    Downsides are that it looks ugly if you don't have an __DIE__ handler - and it still doesn't work for __WARN__.

    my @a=qw(random brilliant braindead); print $a[rand(@a)];
      Downsides are that it looks ugly if you don't have an __DIE__ handler
      If you overload the stringification operator for your object then you should be able to get the desired behaviour for die.

      Another option is that you could overload die and warn e.g

      BEGIN { *CORE::GLOBAL::die = sub { CORE::die("$_[0]->{type}: $_[0]->{msg}\n"); }; *CORE::GLOBAL::warn = sub { CORE::warn("$_[0]->{type}: $_[0]->{msg}\n"); }; } warn { type => "warntest", msg => "missing point" }; die { type => "dietest", msg => "and I'm done" }; __output__ warntest: missing point dietest: and I'm done
      Extraordinarily hackish, but at least there's an option :)
      HTH

      _________
      broquaint