Diese Woche gibt es noch eine Coverversion, diesmal bearbeitet Udo Dirkschneider Queens “We Will Rock You”. Keine Ahnung, ob die Version auch ohne Video Spaß machen würde, so ist sie aber Dank einer gewaltigen Portion Humor (und Hommage) auf jeden Fall sehens- und hörenswert.
Die im Beitrag “MIME::Lite Fehlerbehandlung” implementierte Fehlerbehandlung mit “eval” funktioniert zwar in den meisten Fällen, kann aber in bestimmten Situationen doch nicht zum gewünschten Ergebnis führen.
Eine bessere Alternative ist die Verwendung von z.B. Try::Tiny, welches sich mit den aus anderen Sprachen bekannten “try”, “catch” und “finally”-Anweisungen um die Fehlerbehandlung kümmert:
use strict;
use warnings;
use MIME::Lite;
use Try::Tiny;
MIME::Lite->send('smtp', 'mailserver', Debug => 0);
my $msg = MIME::Lite->new(
From => 'me@whereever.net',
To => 'you@somewhereelse.net',
Data => 'Hello World!',
Subject => 'testmail',
);
try {
$msg->send;
}
catch {
warn "you DON'T have mail!";
};
print "... still running ...";
Nach der Warnung “you DON’T have mail!” wird das Programm mit “… still running …” fortgesetzt.
Ein Skript, welches MIME::Lite zum Versenden von Mails verwendet, hat sich im Fehlerfall lieber direkt mit einem “SMTP Failed to connect to mail server: Bad file descriptor” beendet, statt gemäß Dokumentation auf den Fehler zu reagieren.
use strict;
use warnings;
use MIME::Lite;
MIME::Lite->send('smtp', 'mailserver', Debug => 0);
my $msg = MIME::Lite->new(
From => 'me@whereever.net',
To => 'you@somewhereelse.net',
Data => 'Hello World!',
Subject => 'testmail',
);
$msg->send || die "you DON'T have mail!";
print "... still running ...";
Weder “you DON’T have mail!” noch “… still running …” werden ausgegeben, da diese Stellen im Code auf Grund des Programmabbruchs nicht mehr erreicht werden.
Leider ist die Erläuterung zum Verhalten der Funktion “$msg->send” nicht wirklich hilfreich:
Returns whatever the mail-handling routine returns: this should be true on success, false/exception on error.
Eine Suche im Internet führte zum Blogbeitrag “Perl exception handling”, welcher genau das aufgetretene Verhalten beschreibt und eine Lösungsmöglichkeit mittels “eval” aufzeigt:
use strict;
use warnings;
use MIME::Lite;
MIME::Lite->send('smtp', 'mailserver', Debug => 0);
my $msg = MIME::Lite->new(
From => 'me@whereever.net',
To => 'you@somewhereelse.net',
Data => 'Hello World!',
Subject => 'testmail',
);
eval { $msg->send; };
if ($@) {
print "you DON'T have mail!";
}
print "... still running ...";
So gekapselt läuft das Skript auch nach einem gescheiterten “$msg->send” weiter und auf einen eventuellen Fehler kann reagiert werden.