Ist es OK, $ zuzuweisen? auf einen Fehler in Perl?
Z. B.
if(! (-e $inputfile))
{
$! = "Input file $inputfile appears to be non-existent\n";
return undef;
}
So kann ich alle Fehler auf der obersten Ebene behandeln können.
Danke.
Ist es OK, $ zuzuweisen? auf einen Fehler in Perl?
Z. B.
if(! (-e $inputfile))
{
$! = "Input file $inputfile appears to be non-existent\n";
return undef;
}
So kann ich alle Fehler auf der obersten Ebene behandeln können.
Danke.
Wenn Sie $ !, zuweisen wird es in dem System platziert errno Variable, die nur Zahlen akzeptiert. So kann man in der Tat:
use Errno "EEXIST";
$! = EEXIST;
print $!;
und den String-Wert für einen bestimmten Systemfehlernummer bekommen, aber Sie können nicht tun, was Sie wollen - es auf eine beliebige Zeichenfolge zu setzen. Solch ein String wird Ihnen ein Argument "..." ist nicht numerisch in Skalarzuweisung Warnung und lassen Sie errno auf 0 gesetzt.
Das andere Problem ist, dass $! kann von jedem Systemaufruf geändert werden. Sie können also nur darauf vertrauen, dass Sie den Wert haben, den Sie festgelegt haben, bis Sie einen Druck oder etwas anderes machen. Sie möchten wahrscheinlich Ihre eigene Fehlervariable.
Ja, Sie können stuff (# 's) zu $! Zuweisen, seien Sie vorsichtig, wo Sie es tun, damit Sie nicht einige andere Funktionen Nachricht vermasseln.
Nun, die documentation sagt, es ist im Grunde ein Indikator für Systemfehler. Also würde ich es nicht zuweisen, Sie machen nur Ihre lib's Benutzer verrückt.
Verwenden Ausnahmen statt:
eval { # this ain't the evil eval
# some code
die $something;
}
if (my $err = [email protected]) {
# exception handling
}
Beachten Sie, dass Sie „werfen“, oder sterben, mit über alles, was Sie brauchen ..
Der Wert in $! ist garantiert nichts, es sei denn, es wird direkt nach einem Funktionsaufruf überprüft, dass a. gescheitert und b. behauptet, errno zu verwenden. Wer also gemacht wird, macht etwas falsch. –
Nur als ein FYI, denken viele Leute mit "sterben" innerhalb einer Bibliothek ein sehr TREIF (aka nicht koscher :) Sache. Verwenden Sie die Flags _error/_errors und die entsprechenden Zugriffsmethoden (idealerweise eine für schnelle Wahr/Falsch-Überprüfung und eine für das Drucken einer Fehlerliste). Am besten mach das auf Objektebene :) – DVK
@DVK stimme ich nicht stark zu. Es ist vorzuziehen, dass eine Bibliothek Ausnahmen auslöst, nur so lange, wie sie wirklich außergewöhnlich sind, und Sie dokumentieren, dass Sie Fehler behandeln werden, und Sie sind konsistent. Warum? Der Benutzer der Bibliothek möchte wissen, wenn ein Fehler auftritt. Meistens sterben sie einfach, wenn es einen gibt. Dies führt dazu, dass überall "$ obj-> method oder die $ obj-> error" geschrieben wird. Sie werden faul und vergessen und verpassen einen Fehler. Ausnahmen bedeuten, dass Sie an den Stellen, an denen Sie den Fehler beheben möchten, nur speziellen Code hinzufügen müssen. Verwenden Sie Autodie für eine Weile und Sie werden sehen. – Schwern
Mein Rabbi sagte "Nein!"
Ich bin versucht, dies zu wählen, aber es ist in der Tat koscher, also ist die Antwort zu falsch, um zu wählen :-). Die Lektion hier ist, dem Rabbi nicht zu vertrauen, es sei denn, er kennt auch Perl –
Danke, dass Sie meinen lahmen Versuch des Humors gesehen haben! Laut einem Rabbi und der strengen Definition von Kosher, die $! ist nicht durch ein bestimmtes Gesetz des Judentums abgedeckt, also ist es nicht "koscher". Es kann jedoch für Sie als Nichtjude zulässig sein. – CoderDennis
Ich erwarte, dass jemand den Titel der Frage bearbeitet, also notieren Sie hier, dass der ursprüngliche Titel "Ist es koscher, $ in Perl zuzuweisen?". – ysth
Einstellung $!
ist in Ordnung, aber:
Etwas zu beachten ist, dass die den Wert in $ verwendet! für seinen Ausgangscode (solange es nicht Null ist).
Wenn Sie nur eine Variable zum Speichern von Fehlern haben, haben Sie Probleme, wenn mehr als ein Fehler in Ihrem Programm auftritt, bevor Sie den Status Ihrer Fehlervariablen überprüfen. Das ist es wert, zu vermeiden, wenn Sie ihm helfen können.
Zum Glück in Perl können Sie es helfen. Eine wirklich schöne Lösung ist die objektorientierte Ausnahmebehandlung von Error.pm.Dieses Modul ermöglicht es Ihnen, try/catch-Blöcke, so zu schreiben:
try {
some code;
code that might thrown an exception;
more code;
return;
}
catch Error with {
my $ex = shift; # Get hold of the exception object
# handle the exception;
};
Die CPAN documentation für das Modul ist recht gut, und es gibt einen Perl.com Artikel zu diesem Thema auch.
Ich werde die Verwendung von Ausnahmen, aber nicht Fehler verwenden. Benutze stattdessen [Exception :: Class] (http://search.cpan.org/dist/Exception-Class/lib/Exception/Class.pm), es ist viel fähiger. – jplindstrom
$! hat so viele Vorbehalte, eine globale Variable zu sein, die viele Funktionen zuweisen (einige von ihnen C-Funktionen, die Perl aufruft), dass ich einfach eine Ausnahme (die in Perl Sterben bedeutet) werfe und den Benutzer sie abfangen lassen, wenn sie es interessiert. Also anstatt zu schreiben:
$obj->foo or die $!;
$obj->bar or die $!;
$obj->baz or die $!;
oder sogar
$obj->foo or die $obj->error;
$obj->bar or die $obj->error;
$obj->baz or die $obj->error;
können Sie einfach
$obj->foo;
$obj->bar;
$obj->baz;
schreiben und wissen, dass, wenn es einen Fehler, den Sie davon informiert werden. Auch jeder über dir wird informiert und kann es abfangen. Da dies der häufigste Fall ist, lassen Sie es geschehen, ohne dass der Benutzer sich daran erinnern muss und es immer und immer wieder eingeben muss. Wenn Sie den Fehler ignorieren oder beheben möchten, verwenden Sie einfach eval BLOCK
.
Da dies der Ausnahmefall ist, sollte der Benutzer daran denken, mehr Code hinzuzufügen und mehr Arbeit zu leisten.
Beispiele für diesen Ansatz sind DBI's RaiseError flag, die standardmäßig nur für Abwärtskompatibilität deaktiviert ist, und das wunderbare Modul autodie.
Ich glaube nicht, dass Perl überhaupt koscher wäre ...;) –