Perl - Fehlerbehandlung

Die Ausführung und die Fehler gehören immer zusammen. Wenn Sie eine Datei öffnen, die nicht vorhanden ist. Wenn Sie mit dieser Situation nicht richtig umgegangen sind, wird Ihr Programm als von schlechter Qualität eingestuft.

Das Programm stoppt, wenn ein Fehler auftritt. Daher wird eine ordnungsgemäße Fehlerbehandlung verwendet, um verschiedene Arten von Fehlern zu behandeln, die während einer Programmausführung auftreten können, und geeignete Maßnahmen zu ergreifen, anstatt das Programm vollständig anzuhalten.

Sie können einen Fehler auf verschiedene Arten identifizieren und abfangen. Es ist sehr einfach, Fehler in Perl abzufangen und dann richtig zu behandeln. Hier sind einige Methoden, die verwendet werden können.

Die if-Anweisung

Das if statementist die naheliegende Wahl, wenn Sie den Rückgabewert einer Anweisung überprüfen müssen. zum Beispiel -

if(open(DATA, $file)) {
   ...
} else {
   die "Error: Couldn't open the file - $!";
}

Hier Variable $! gibt die eigentliche Fehlermeldung zurück. Alternativ können wir die Anweisung in Situationen, in denen dies sinnvoll ist, auf eine Zeile reduzieren. zum Beispiel -

open(DATA, $file) || die "Error: Couldn't open the file $!";

Die es sei denn Funktion

Das unlessFunktion ist das logische Gegenteil von if: Anweisungen können den Erfolgsstatus vollständig umgehen und nur ausgeführt werden, wenn der Ausdruck false zurückgibt. Zum Beispiel -

unless(chdir("/etc")) {
   die "Error: Can't change directory - $!";
}

Das unlessDie Anweisung wird am besten verwendet, wenn Sie einen Fehler oder eine Alternative nur dann auslösen möchten, wenn der Ausdruck fehlschlägt. Die Anweisung ist auch sinnvoll, wenn sie in einer einzeiligen Anweisung verwendet wird -

die "Error: Can't change directory!: $!" unless(chdir("/etc"));

Hier sterben wir nur, wenn die chdir-Operation fehlschlägt und sie gut liest.

Der ternäre Operator

Für sehr kurze Tests können Sie den bedingten Operator verwenden ?:

print(exists($hash{value}) ? 'There' : 'Missing',"\n");

Es ist hier nicht ganz so klar, was wir erreichen wollen, aber der Effekt ist der gleiche wie bei der Verwendung eines if oder unlessErklärung. Der bedingte Operator wird am besten verwendet, wenn Sie schnell einen der beiden Werte innerhalb eines Ausdrucks oder einer Anweisung zurückgeben möchten.

Die Warnfunktion

Die Warnfunktion löst nur eine Warnung aus, eine Nachricht wird an STDERR gedruckt, es werden jedoch keine weiteren Maßnahmen ergriffen. Es ist daher nützlicher, wenn Sie nur eine Warnung für den Benutzer drucken und mit dem Rest des Vorgangs fortfahren möchten.

chdir('/etc') or warn "Can't change directory";

Die Würfelfunktion

Die Die-Funktion funktioniert genauso wie warn, außer dass sie auch exit aufruft. Innerhalb eines normalen Skripts bewirkt diese Funktion, dass die Ausführung sofort beendet wird. Sie sollten diese Funktion verwenden, falls es sinnlos ist, fortzufahren, wenn ein Fehler im Programm vorliegt -

chdir('/etc') or die "Can't change directory";

Fehler innerhalb der Module

Es gibt zwei verschiedene Situationen, mit denen wir umgehen sollten -

  • Melden eines Fehlers in einem Modul, in dem der Dateiname und die Zeilennummer des Moduls angegeben sind. Dies ist nützlich, wenn Sie ein Modul debuggen oder wenn Sie speziell einen modulbezogenen und keinen skriptbezogenen Fehler auslösen möchten.

  • Melden eines Fehlers in einem Modul, das die Informationen des Anrufers zitiert, damit Sie die Zeile innerhalb des Skripts debuggen können, die den Fehler verursacht hat. Auf diese Weise hervorgerufene Fehler sind für den Endbenutzer nützlich, da sie den Fehler in Bezug auf die Ursprungszeile des aufrufenden Skripts hervorheben.

Das warn und dieFunktionen funktionieren etwas anders als erwartet, wenn sie innerhalb eines Moduls aufgerufen werden. Zum Beispiel das einfache Modul -

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   warn "Error in module!";
}
1;

Wenn aus einem Skript wie unten aufgerufen -

use T;
function();

Es wird das folgende Ergebnis erzeugt -

Error in module! at T.pm line 9.

Dies ist mehr oder weniger das, was Sie erwartet haben, aber nicht unbedingt das, was Sie wollen. Aus Sicht eines Modulprogrammierers sind die Informationen nützlich, da sie auf einen Fehler im Modul selbst hinweisen. Für einen Endbenutzer sind die bereitgestellten Informationen ziemlich nutzlos, und für alle außer dem gehärteten Programmierer sind sie völlig sinnlos.

Die Lösung für solche Probleme ist das Carp-Modul, das eine vereinfachte Methode zum Melden von Fehlern in Modulen bietet, die Informationen über das aufrufende Skript zurückgeben. Das Karpfenmodul bietet vier Funktionen: Karpfen, Glucksen, Krächzen und Geständnis. Diese Funktionen werden unten diskutiert.

Die Karpfenfunktion

Die Karpfenfunktion ist das grundlegende Äquivalent von warn und druckt die Nachricht an STDERR, ohne das Skript tatsächlich zu verlassen und den Skriptnamen zu drucken.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   carp "Error in module!";
}
1;

Wenn aus einem Skript wie unten aufgerufen -

use T;
function();

Es wird das folgende Ergebnis erzeugt -

Error in module! at test.pl line 4

Die Gluckfunktion

Die Cluck-Funktion ist eine Art aufgeladener Karpfen. Sie folgt demselben Grundprinzip, druckt jedoch auch eine Stapelverfolgung aller Module, die zum Aufruf der Funktion geführt haben, einschließlich der Informationen im ursprünglichen Skript.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);

sub function {
   cluck "Error in module!";
}
1;

Wenn aus einem Skript wie unten aufgerufen -

use T;
function();

Es wird das folgende Ergebnis erzeugt -

Error in module! at T.pm line 9
   T::function() called at test.pl line 4

Die Krächzfunktion

Das croak Funktion ist äquivalent zu die, außer dass der Anrufer eine Ebene höher gemeldet wird. Wie die beendet auch diese Funktion das Skript, nachdem der Fehler an STDERR gemeldet wurde -

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   croak "Error in module!";
}
1;

Wenn aus einem Skript wie unten aufgerufen -

use T;
function();

Es wird das folgende Ergebnis erzeugt -

Error in module! at test.pl line 4

Wie bei Karpfen gelten die gleichen Grundregeln für das Einfügen von Zeilen- und Dateiinformationen gemäß den Warn- und Matrizenfunktionen.

Die Geständnisfunktion

Das confess Funktion ist wie cluck;; Es ruft die auf und druckt dann eine Stapelverfolgung bis zum Ursprungsskript.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   confess "Error in module!";
}
1;

Wenn aus einem Skript wie unten aufgerufen -

use T;
function();

Es wird das folgende Ergebnis erzeugt -

Error in module! at T.pm line 9
   T::function() called at test.pl line 4