hi,
Warum es die Fehlersuche erschweren soll, musst du erklären.
Noch ein Beispiel, wenn im Konstruktor nicht geprüft wird, sondern erst in der Methode, wo die Instanz einer foreign class gebraucht wird:
package MyClass;
use strict;
use warnings;
use Carp;
sub new{
my $class = shift;
my $fh = shift;
return eval{
my $self = bless{}, $class;
$self->{FH} = $fh; # hier Keine Prüfung
$self;
};
}
sub getFileContent{
my $self = shift;
my $filename = shift;
return eval{
# hier die Prüfung, ob das fremde Objekt passt
# Alle Meldungen, die hier eine Exception werfen, zeigen auf die
# Zeile im Anwendungsscript, in welcher die Methode
# 'getFileContent' aufgerufen wird
croak "Wrong object, expect IO::File" if ref $self->{FH} ne 'IO::File';
$self->{FH}->open($filename, "r") or croak "IO-Err: $!";
read($self->{FH}, my $buffer, -s $self->{FH});
$self->{FH}->close;
$buffer;
};
}
package main;
use strict;
use warnings;
use IO::File;
my $obj = MyClass->new() or die $@; # Objekt nicht übergeben, der Fehler ist hier in Zeile 39!
my $fileContent = $obj->getFileContent("d:/tmp/cookiefile") or die $@; # Zeile 40
# Wrong object, expect IO::File at pack.pl line 40
print $fileContent;
Mit solch einer Fehlermeldung wird sich der Anwender der Klasse verwundert fragen, wie er der Methode 'getFileContent' ein IO::File Objekt übergeben soll!?
Zugegeben, das ist alles ein bischen konstruiert, um nicht zu sagen geschönt. In der Praxis habe ich jedoch noch viel ekelhaftere Sachen gesehen, da wurde oft gar nicht geprüft, i.d.R. wurde nur ein warn("oh hier stimmt was nicht") notiert, dementsprechend sahen die Logfiles der Webserver aus und die Fehlersuche beanspruchte nicht nur Stunden sondern Tage.
Mit solchen Konstrukten macht die Verwendung des Carp-Moduls ja auch keinen Sinn, und genau dieses Modul zeigt bei fachgerechter Anwendung auch ganz genau die richtige Zeile, wo der Fehler aufgetreten ist.
Schönes Wochenende,
Hotti