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


in reply to Trap the error msg from Mime::Lite

Did someone say "trap"? Test::Trap to the rescue! :)

The error message you want is printed on STDOUT on my machine. I was expecting STDERR. Other errors may come from the Perl code, so we want the $@ as well. My very own Test::Trap can give you all! :)

The example below, based on your code, makes use of the :output(systemsafe) pseudo layer, new in version 0.1.0. Older versions of Test::Trap may use :flow:stderr(systemsafe):stdout(systemsafe) to much the same effect.

#!/usr/bin/perl -w use Test::Trap qw/ :output(systemsafe) /; use MIME::Lite; # send mail attachments use Sys::Hostname; # Used to insert hostname in emails use Cwd; # Get current full dir for error msgs use strict; # Enforce declarations my ( $hostname, # name of this box for sending $prog_full_name, # prog path + name $contact_email, # contact email address $msg, # msg object $sender, # sender of email $subject, # subject line in email $body_text # actual email msg text ); # Get hostname anyway we can using Sys::Hostname; # tries syscall(SYS_gethostname), `hostname`, `uname -n` $hostname = Sys::Hostname::hostname(); # Get program full path name $prog_full_name = cwd()."/${0}"; # Set the fields required by Mailer... $contact_email = ''; $sender = "$prog_full_name"; $subject = "$prog_full_name: Asset Mgr Report"; $body_text = "This is an automated message:\n\n"; # ... and send it # Header $msg = MIME::Lite->new( From => $sender, To => $contact_email, Subject => $subject, Type =>'multipart/mixed' ); # Body Content $msg->attach( Type => 'TEXT', Data => $body_text ); # Attachment $msg->attach( Type => 'text/plain', Path => "/home/chrism/t.cvs", Filename => "t.csv", Disposition => 'attachment' ); # Send trap { $msg->send or print "Error: $@\n" }; $_ and print "Error: $_\n" for $trap->die, $trap->stdout, $trap->s +tderr;

print "Just another Perl ${\(trickster and hacker)},"
The Sidhekin proves Sidhe did it!

Replies are listed 'Best First'.
Re^2: Trap the error msg from Mime::Lite
by chrism01 (Friar) on Jan 23, 2008 at 04:28 UTC
    Thx,
    That seems to work.
    The only problem is that it outputs to stdout. What I need to do is capture those error(s), print a copy to stdout (which along with stderr is re-directed to my logfile) and save a copy in a variable that I can then use elsewhere.
    I'm having trouble re-arranging your code to do that (save a copy)
    Help..

    Cheers
    Chris

      What I need to do is capture those error(s), print a copy to stdout (which along with stderr is re-directed to my logfile) and save a copy in a variable that I can then use elsewhere.

      Right. I think I'd choose grep for that one. Replace my last line above with these:

      my @errors = grep { defined && length } $trap->die, $trap->stderr, $tr +ap->stdout; print "Error: $_\n" for @errors; # any and all error(s) are now left in @errors

      Update: Oh, and "logfile"? Is this for production, not just testing? Then I'd definitely get Test::Trap version 0.1.0 — it fixes, among other things, a bug that in this case might slowly fill up your /tmp partition. Oops.

      print "Just another Perl ${\(trickster and hacker)},"
      The Sidhekin proves Sidhe did it!

        Thx for the warning(!). Just checked and the 1st 2 lines are:
        package Test::Trap; use version; $VERSION = qv('0.1.0');
        so hopefully that's all good. :)

        Actually, I already came up with this:

        # Send trap { $msg->send or $error_msg = "Error: $! $@\n" }; $_ and $error_msg .= ": $_\n" for $trap->die, $trap->stdout, $trap +->stderr; exit_with_error("email_csv_file() failed: $error_msg") if( $error_ +msg );
        to try and get everything. Looks ok?

        My exit_with_error($msg) sub sends a regular email via Mail::Mailer and prints to the logfile, then cleans up other stuff and and exit(1) etc.
        Y, it's a prodn system. No cxn to internet though (and I don't have root), so I have to go through the sysadmin to get extra modules installed like Test::Trap, version.pm etc. Hence the delay in my replies.

        Cheers
        Chris