Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re: Trap the error msg from Mime::Lite

by Sidhekin (Priest)
on Jan 22, 2008 at 17:25 UTC ( #663637=note: print w/ replies, xml ) Need Help??


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!


Comment on Re: Trap the error msg from Mime::Lite
Select or Download Code
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

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (5)
As of 2015-07-07 04:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (87 votes), past polls